5.合并果子 Huffman树

 

 经典的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 }

 

posted @ 2020-08-21 15:50  kyk333  阅读(116)  评论(0)    收藏  举报