您的位置:首页 > 其它

题目1107:搬水果

2014-02-22 17:29 253 查看
// 很简单的一种方法:堆

// 树的带权路径长度等于非叶子节点权值之和,所以和上一次的哈夫曼树是完全相同的。

#include<stdio.h>

#include<queue>

using namespace std;

priority_queue<int,vector<int>,greater<int> > Q; // 小顶堆

int main()

{

int n;

while(scanf("%d\n",&n)!=EOF){

if(n==0) break;

while(Q.empty()==false) Q.pop();

while(n--){

int x;

scanf("%d",&x);

Q.push(x);

}

int ans=0,tmp=0;

while(Q.size()>1){

int a=Q.top(); Q.pop(); // 取出堆中两个最小值并出堆,并把和存入堆中,

int b=Q.top(); Q.pop();

ans+=a+b;

Q.push(a+b);

}

printf("%d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: