标签:
http://poj.org/problem?id=3253
这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树
这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出13被用到2次,8被用到1次13*2+8=34。
这幅图片,我们先据下21,再据下5,再据下8得到34,即16*2+5=37。
所以,对于这道题,我们运用贪心的思想和哈夫曼树
1 #include<queue> 2 #include<stdio.h> 3 using namespace std; 4 int main() 5 { 6 long long int sum; 7 int i,n,t,a,b; 8 while(~scanf("%d",&n)) 9 { 10 priority_queue<int,vector<int>,greater<int> >q; 11 for(i=0; i<n; i++) 12 { 13 scanf("%d",&t); 14 q.push(t); 15 } 16 sum=0; 17 if(q.size()==1) 18 { 19 a=q.top(); 20 sum+=a; 21 q.pop(); 22 } 23 while(q.size()>1) 24 { 25 a=q.top(); 26 q.pop(); 27 b=q.top(); 28 q.pop(); 29 t=a+b; 30 sum+=t; 31 q.push(t); 32 } 33 printf("%lld\n",sum); 34 } 35 return 0; 36 }
标签:
原文地址:http://www.cnblogs.com/shangjindexiaoqingnian/p/5936503.html