上进小青年

导航

哈夫曼树---POJ3253

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 }

 

posted on 2016-10-07 19:12  上进小青年  阅读(150)  评论(0编辑  收藏  举报