合并果子优先队列

合并果子
每次取出两个最小的,求和之后再放进去,再取出两个最小的,依次进行下去。当然,每次取出之后都需要累加两个数。

本文使用优先队列,也就是最小堆实现

typedef long long ll;
priority_queue< ll,vector<ll>,greater<ll> > pq;//从小到大排序

优先队列的大小大于1pq.size()>1时,取出两个top元素。

ac代码

#include<iostream>
#include<queue>
using namespace std;
const int maxn=1e4+10;
typedef long long ll;
ll n,sum=0,tmp;

priority_queue<ll,vector<ll>,greater<ll> > pq;//从小到大
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>tmp;
        pq.push(tmp);
    }
    
    while(pq.size()>1){
        ll tmp1=pq.top();//最小的
        pq.pop();
        ll tmp2=pq.top();
        pq.pop();
        sum+=tmp1+tmp2;
        pq.push(tmp1+tmp2);
    }
    cout<<sum<<endl;

    
    
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章