合併果子
每次取出兩個最小的,求和之後再放進去,再取出兩個最小的,依次進行下去。當然,每次取出之後都需要累加兩個數。
本文使用優先隊列,也就是最小堆實現
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;
}