1369:合并果子(fruit)
将所有果堆使用小根堆进行表示.
- 每次合并果堆中最小的两个果堆(即每次取小根堆的根节点).
- 将合并的结果再放入果堆.
执行上述两步直到只剩下一个果堆.
下面是用优先队列(其底层就是堆表示)ac的代码:
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int main(){
std::ios::sync_with_stdio(false);
int n,t;
priority_queue<int,vector<int>,greater<int>> q;
cin>>n;
while(n--){
cin>>t;
q.push(t);
}
int ans=0;
while(q.size()>1){
int x=q.top();q.pop();
int y=q.top();q.pop();
ans+=x+y;
q.push(x+y);
}
cout<<ans;
return 0;
}