[AcWing] 148. 合并果子(C++实现)贪心---哈夫曼树例题
1. 题目
2. 读题(需要重点注意的东西)
思路:
贪心 -----> 每次在当前的选法中,选择能选的情况中的最优解
解题思路:
每次取最小的两堆合并成一堆,然后重复,直至最后只有一堆。
代码实现思路:
用小根堆保存所有的数,每次合并时,pop出两个数求和,然后将这两个数的和push进小根堆即可
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
priority_queue<int, vector<int>, greater<int>> heap;
while (n -- )
{
int x;
scanf("%d", &x);
heap.push(x);
}
int res = 0;
while (heap.size() != 1)
{
int a = heap.top(); heap.pop();
int b = heap.top(); heap.pop();
res += a + b;
heap.push(a + b); // 注意这里是push a+b,不是push res
}
printf("%d\n", res);
return 0;
}
可能存在的问题(所有问题的位置都在上述代码中标注了出来)
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 贪心
6. 总结
贪心思想、哈夫曼树的例题,理解思想并自行推导出代码。
哈夫曼树的核心:每次合并两个最小的堆,直至全部合并完即可。