樹-堆結構練習——合并果子之哈夫曼樹 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status
Description 在一個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合并之後,就只剩下一堆了。多多在合并果子時總共消耗的體力等於每次合并所消耗體力之和。
Input 第一行是一個整數n(1<=n<=10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個ai(1<=ai<=20000)是第i個果子的數目。
Output 輸出包括一行,這一行只包含一個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2^31。
Sample Input
31 2 9
Sample Output
15
要使搬運花費的力氣最少,則每次搬運都要搬品質盡量小的那兩堆。運用優先隊列,隊頂放最小值,每次取出兩個最小元素,求出和之後排入佇列中。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <queue>using namespace std;struct cmp{ bool operator()(const int &a,const int& b) { return a > b; }};int main(){ priority_queue<int,vector<int>,cmp> q; int n,i,j,k,sum = 0; scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%d",&k); q.push(k) ; } while( q.size() != 1 ) { int x1 , x2 ; x1 = q.top(); q.pop(); x2 = q.top(); q.pop(); sum += (x1 + x2) ; q.push(x1+x2); } printf("%d\n",sum); return 0;}