[JOBDU1172]哈夫曼树

题目大意:
  给你一堆权值,求这些权值建成哈夫曼树后的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 }

 

posted @ 2017-10-12 15:06  skylee03  阅读(133)  评论(0编辑  收藏  举报