洛谷P1090 合并果子(优先队列+贪心)

地址:https://www.luogu.com.cn/problem/P1090

解析:

要想最后花费最少,肯定每次要加入两个最小值。

所以贪心思路,就是每次取剩余堆的两个最小值相加,相加以后,把它放入队列。

使用优先队列实现:

priority_queue<int,vector<int>,greater<int> > q;//优先为小的优先队列 

因为合并所有,最多也就是n-1次,所以for遍历n-1次即可。

#include<cstdio>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;//优先为小的优先队列 
typedef long long ll;
const int maxn=1e5+20;
int a[maxn];
struct node
{
    ll l,r;
}st[maxn];
bool cmp(node a , node b)
{
    if(a.l==b.l)
        return a.r<b.r;
    return a.l<b.l;
}
int main()
{    // 4 0 20
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        q.push(a[i]);
    }
    if(n==1)
        cout<<a[1]<<endl;
    else
    {
        int sum=0,md=0;
        for(int i=1;i<n;i++)
        {
            int a=q.top();
            q.pop();
            int b=q.top();
            q.pop();
            sum+=a+b;
            q.push(a+b);
        }
        cout<<sum<<endl;
    }
    
}

 

posted @ 2020-07-09 18:07  liyexin  阅读(196)  评论(0编辑  收藏  举报