分糖果c++蓝桥杯
时间: 2025-05-02 15:41:40 AIGC 浏览: 43
### C++ 蓝桥杯 分糖果 解法
分糖果问题是经典的贪心算法应用之一。以下是基于题目描述的解题思路以及完整的代码实现。
#### 题目分析
该问题的核心在于分配糖果给学生,满足两个条件:
1. 每个学生至少获得一个糖果。
2. 成绩较高的学生相较于其相邻的学生获得更多糖果。
为了达到全局最优解(即使用的糖果总数最少),可以采用 **两次遍历** 的方法来解决问题[^1]。
#### 解题思路
1. 初始化数组 `candies`,长度等于学生的数量,初始值均为 1(因为每个学生至少要有一个糖果)。
2. 进行一次正向遍历(从左到右),确保右边学生成绩更高时,对应的糖果更多。
3. 再进行一次反向遍历(从右到左),同样确保左边学生成绩更高时,对应的糖果更多。
4. 计算最终所需的糖果总数。
此方法的时间复杂度为 O(n),空间复杂度也为 O(n)。
#### 完整代码实现 (C++)
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n; // 输入学生人数
vector<int> scores(n);
for (int i = 0; i < n; ++i) {
cin >> scores[i]; // 输入每个学生的分数
}
vector<int> candies(n, 1); // 初始每人至少有 1 个糖果
// 正向遍历:处理右侧邻居的关系
for (int i = 1; i < n; ++i) {
if (scores[i] > scores[i - 1]) {
candies[i] = candies[i - 1] + 1; // 如果当前学生成绩高于前一位,则多发一颗糖
}
}
// 反向遍历:处理左侧邻居的关系
for (int i = n - 2; i >= 0; --i) {
if (scores[i] > scores[i + 1]) {
candies[i] = max(candies[i], candies[i + 1] + 1); // 确保当前糖果数大于右侧较高成绩的同学
}
}
long long total_candies = 0;
for (int candy : candies) {
total_candies += candy; // 统计总的糖果数目
}
cout << total_candies << endl; // 输出结果
return 0;
}
```
上述代码实现了两轮遍历来计算所需糖果的数量,并保证了局部约束条件下整体最优的结果。
#### 关键点解释
- 使用 `max()` 函数是为了在反向遍历时更新糖果数量,防止某些情况下糖果数量减少的情况发生。
- 时间复杂度主要由两次线性扫描决定,因此效率非常高。
---
####
阅读全文
相关推荐
















