/*有N堆果子,每堆果子的质量已知,现在需要把这些果子合并成为一堆,但是每次只能把两堆果子合并到一起,
同时会消耗与两堆果子的质量之和等值的体力。显然,在进行N-1次合并时,就只剩下一堆了。为了尽可能节省体力,请设计出、
合并的次序方案,使得耗费的体力最少,并给出消耗的体力。
假如有三堆果子,质量依次为1,2,9,那么可以先将质量为1和2 的果堆合并,新堆的质量为3,因此耗费的体力为3,接着,将新堆与原先的质量
为9的果堆合并,又得到新的堆,质量为12,因此耗费体力为12,所以耗费体力之和为12+3=15.可以证明15是最小的体力消耗值。
*/
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<long long,vector<long long>,greater<long long> > q;//数值越小,优先级越高
int main(){
int n;
long long temp,x,y,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lld",&temp);
q.push(temp);
}
while(q.size()>1){
x=q.top();
q.pop();
y=q.top();
q.pop();
q.push(x+y);
ans+=x+y;
}
printf("%lld\n",ans);
return 0;
}
算法笔记学习之哈夫曼树
最新推荐文章于 2020-08-19 00:07:26 发布