直接用一个优先队列去模拟Huffman树的建立过程。
每次取优先队列前两个数,然后累加其和,把这个和在放入到优先队列中去。
1 #include <cstdio> 2 #include <queue> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 while(scanf("%d", &n) == 1 && n) 9 { 10 priority_queue<int, vector<int>, greater<int> > q; 11 int x, ans = 0; 12 for(int i = 0; i < n; i++) { scanf("%d", &x); q.push(x); } 13 for(int i = 0; i < n-1; i++) 14 { 15 int a = q.top(); q.pop(); 16 int b = q.top(); q.pop(); 17 ans += a + b; 18 q.push(a + b); 19 } 20 printf("%d ", ans); 21 } 22 23 return 0; 24 }