C++实现果子合并问题,最小体力消耗求解
### 🍎问题分析 本题的核心是要将不同堆的果子合并成一堆,每次合并两堆果子的体力消耗为两堆果子重量之和,目标是找到一种合并次序方案,使得总体力消耗最小。可以使用贪心算法,每次都选择当前重量最小的两堆果子进行合并,这样能保证每次合并的消耗尽可能小,从而使总的体力消耗最小。 ### 💻代码实现 ```cpp #include <iostream> #include <queue> #include <vector> using namespace std; int main() { int n; cin >> n; // 定义一个优先队列(小顶堆)来存储每种果子的数量 priority_queue<int, vector<int>, greater<int>> pq; for (int i = 0; i < n; i++) { int a; cin >> a; pq.push(a); } int total_cost = 0; // 当队列中元素数量大于 1 时,继续合并 while (pq.size() > 1) { // 取出重量最小的两堆果子 int first = pq.top(); pq.pop(); int second = pq.top(); pq.pop(); // 计算合并这两堆果子的体力消耗 int cost = first + second; total_cost += cost; // 将合并后的新堆果子放回队列 pq.push(cost); } cout << total_cost << endl; return 0; } ``` ### 📖代码解释 1. **优先队列的使用**:`priority_queue<int, vector<int>, greater<int>> pq;` 定义了一个小顶堆,每次从堆中取出的元素都是当前堆中最小的元素。 2. **输入处理**:通过 `cin` 读取果子的种类数 `n` 和每种果子的数量,并将其插入到优先队列中。 3. **合并过程**:在 `while` 循环中,每次取出队列中重量最小的两堆果子,计算合并它们的体力消耗,并将合并后的新堆果子放回队列,直到队列中只剩下一堆果子。 4. **输出结果**:最后输出总的体力消耗。 ### ⚙️复杂度分析 - **时间复杂度**:每次从优先队列中取出元素和插入元素的时间复杂度为 $O(log n)$,总共需要进行 $n - 1$ 次合并操作,因此总的时间复杂度为 $O(n log n)$。 - **空间复杂度**:主要使用了优先队列来存储果子的数量,空间复杂度为 $O(n)$。 ### 💡开发建议 - **优先队列的选择**:在 C++ 中,优先队列是一个非常有用的数据结构,可以方便地实现堆排序。对于需要频繁取出最小元素的场景,使用小顶堆可以提高效率。 - **边界条件处理**:在编写代码时,要注意边界条件的处理,例如当果子种类数为 1 时,不需要进行合并操作,直接输出 0。 - **代码可读性**:可以添加适当的注释来提高代码的可读性,方便后续的维护和理解。 ### 📚学习资源 - [C++ 优先队列文档](https://en.cppreference.com/w/cpp/container/priority_queue) - 《算法导论》:这本书详细介绍了各种算法和数据结构,对于学习算法和提高编程能力非常有帮助。 ######[AI写代码神器 | 788点数解答 | 2026-07-26 14:41:55]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)538
- 旅行售货员问题:详细步骤剖析与贪心算法Python代码实现(字节豆包 | 444点数解答 | 2024-12-17 03:32:59)356
- Dev C++ 实现旅行售货员问题:最小路程路线代码与详细解析 (字节豆包 | 448点数解答 | 2024-12-17 03:33:42)240
- C++ 求解 P1020 小核桃与删除字符串问题:双指针与枚举策略 (字节豆包 | 330点数解答 | 2026-02-07 18:40:10)94
- 轻松补全代码:实现三个数组合并的秘诀(GPT | 44点数解答 | 2024-05-20 22:24:51)339
- 不使用冒泡排序,用归并排序降序合并 bina 与 binb 并输出结果!(GPT | 48点数解答 | 2024-06-01 16:26:38)367
- C++:bindata 类实现文件二进制整数读取、排序与归并合并输出(GPT | 1814点数解答 | 2024-06-01 16:28:14)345
- C++:bindata 类实现文件二进制读取、排序与归并合并输出(GPT | 811点数解答 | 2024-06-01 16:29:51)336
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)456
- 浙闽“板凳龙”舞龙队 300 秒螺线盘入:位置与速度全揭秘(阿里通义 | 886点数解答 | 2024-09-07 10:31:31)714
- 浙闽“板凳龙”舞龙队 300 秒位置与速度数学模型揭秘(GPT | 565点数解答 | 2024-09-07 10:32:56)600
- 223节板凳龙沿等距螺线盘入:300秒内位置与速度的数学揭秘 (讯飞星火 | 443点数解答 | 2024-09-07 10:34:10)438