贪心合并果子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心合并果子相关的知识,希望对你有一定的参考价值。

这是一道非常经常的贪心问题。

题目所遵循的原则就是 把最小的两个元素合并的话 体力消耗最少(抱歉 我不会证明 )

之后的话用优先队列读入所有数(得重载运算符从小到大排),之后每次把队首的元素取出来和后一个元素合并。合并完后再扔进队列,循环n-1次。直到只剩下一堆时

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >Q;    //创建优先对列 greater<int>就是让该队列自动从小(队头)到大(队尾)排序,若改作less<int>则是从大(队头)到小(队尾)。
int N,x,ans=0,tmp=0;
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
        {
            cin>>x;
            Q.push(x);    //将果子数入队 它将自动排序
        }
    for(int i=1;i<=N-1;i++)
        {
            tmp=Q.top();    //读取当前最小的一堆
            Q.pop();
            tmp=tmp+Q.top();    //读取当前第二小的一堆与最小的一堆合并
            Q.pop();
            Q.push(tmp);           //将刚刚合并的两堆重新入队,让它再次排序
            ans=ans+tmp;         //统计所用的能量
        }
        cout<<ans;       
return 0;
}
合并果子

 

以上是关于贪心合并果子的主要内容,如果未能解决你的问题,请参考以下文章

vij 1097 贪心

贪心-哈夫曼问题

贪心合并果子

合并果子2之蚂蚁搬沙 贪心

P1090 合并果子

合并果子