合并果子
每次取出两个最小的,求和之后再放进去,再取出两个最小的,依次进行下去。当然,每次取出之后都需要累加两个数。
本文使用优先队列,也就是最小堆实现
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;
}