码迷,mamicode.com
首页 > 其他好文 > 详细

[JOBDU1172]哈夫曼树

时间:2017-10-12 15:37:46      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:char   clear   blog   tin   贪心   构建   printf   答案   class   

题目大意:
  给你一堆权值,求这些权值建成哈夫曼树后的WPL。

思路:
  哈夫曼树的WPL等于各非叶子结点权值之和。
  所以直接贪心模拟构建哈夫曼树的过程。
  先把所有的权值放在一个堆中,然后每次取里面最小的两个数加到答案中,并将他们的和重新放到堆中。
  整个过程并不需要把树存下来。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<ext/pb_ds/priority_queue.hpp>
 4 inline int getint() {
 5     register char ch;
 6     while(!isdigit(ch=getchar()));
 7     register int x=ch^0;
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0);
 9     return x;
10 }
11 __gnu_pbds::priority_queue<int,std::greater<int> > q;
12 int main() {
13     int n;
14     while(~scanf("%d",&n)) {
15         q.clear();
16         for(register int i=1;i<=n;i++) {
17             q.push(getint());
18         }
19         int ans=0;
20         for(register int i=1;i<n;i++) {
21             int tmp=q.top();
22             q.pop();
23             tmp+=q.top();
24             q.pop();
25             ans+=tmp;
26             q.push(tmp);
27         }
28         printf("%d\n",ans);
29     }
30     return 0;
31 }

 

[JOBDU1172]哈夫曼树

标签:char   clear   blog   tin   贪心   构建   printf   答案   class   

原文地址:http://www.cnblogs.com/skylee03/p/7656171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!