哈夫曼树
例题
有n堆果子,每堆果子的质量已知,现在需要把这些果子合并成一堆,但是每次只能把两堆果子合并到一起,同时会消耗与两堆果子质量之和等值的体力。显然,在进行n-1次合并之后,就只剩下一堆了。为了尽可能节省体力,请设计出合并的次序方案,使得耗费的体力最少,并给出消耗的体力值。
例如有3堆果子,质量依次为1、2、9。那么可以先将质量为1和2的果堆合并,新堆质量为3,因此耗费体力为3。接着,将新堆与原先的质量为9的果堆合并,又得到新的堆,质量为12,因此耗费体力为12。所以耗费体力之和为3+12=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;
}