每次取出两个优先队列中最小的合并 然后再加入队列中
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;//取最小的优先队列
int main(){
int n,a,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>a;
q.push(a);
}
int ans=0;
while(q.size()>1){//当小于等于1时说明合并完成
x=q.top();
q.pop();
y=q.top();
q.pop();
ans+=x+y;
q.push(x+y);
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种使用优先队列实现的合并算法,通过不断取出队列中的最小元素进行合并,最终得到所有元素合并的总代价。该算法适用于解决如最小生成树等问题。
488

被折叠的 条评论
为什么被折叠?



