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


![[AcWing] 148. 合并果子(C++实现)贪心---哈夫曼树例题 [AcWing] 148. 合并果子(C++实现)贪心---哈夫曼树例题](http://www.mshxw.com/aiimages/31/675865.png)
