合併果子優先隊列

合併果子
每次取出兩個最小的,求和之後再放進去,再取出兩個最小的,依次進行下去。當然,每次取出之後都需要累加兩個數。

本文使用優先隊列,也就是最小堆實現

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章