1. 程式人生 > >[JOBDU1172]哈夫曼樹

[JOBDU1172]哈夫曼樹

pan type ret tchar color int() blog urn inline

題目大意:
  給你一堆權值,求這些權值建成哈夫曼樹後的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]哈夫曼樹