算法笔记学习之哈夫曼树

/*有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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值