经典的Huffman树问题
样例用树表示出来就是这样
Huffman树一定是一个完全二叉树,每一个节点一定有俩儿子,叶子节点除外,不存在只有一个儿子的情况
所有叶子节点就是需要合并的节点
总消耗就是
贪心思路:每次挑选出来最小的两个合并,直到合并到一堆为止
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 int n; 5 cin >> n; 6 priority_queue<int, vector<int>, greater<int> > heap; 7 while (n--) { 8 int x; 9 cin >> x; 10 heap.push(x); 11 } 12 int res = 0; 13 while (heap.size() > 1) { 14 int a = heap.top(); 15 heap.pop(); 16 int b = heap.top(); 17 heap.pop(); 18 res += (a + b); 19 heap.push(a + b); 20 } 21 cout << res << endl; 22 return 0; 23 }