[JOBDU1172]哈夫曼樹
阿新 • • 發佈:2017-10-12
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 charch; 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]哈夫曼樹