C++ 解决老师奖励同学铅笔数量问题:最少奖励方案揭秘
以下是解决该问题的C++代码: ```cpp #include <iostream> #include <vector> #include <sstream> #include <string> using namespace std; // 函数用于将字符串按逗号分割成整数向量 vector<int> split(const string& s) { vector<int> result; stringstream ss(s); string token; while (getline(ss, token, ',')) { result.push_back(stoi(token)); } return result; } int main() { int n; cin >> n; cin.ignore(); // 忽略换行符 string scoresStr; getline(cin, scoresStr); vector<int> scores = split(scoresStr); // 初始化每个同学的铅笔数为1 vector<int> pencils(n, 1); // 从左到右遍历,确保右边成绩高的同学铅笔数更多 for (int i = 1; i < n; ++i) { if (scores[i] > scores[i - 1]) { pencils[i] = pencils[i - 1] + 1; } } // 从右到左遍历,确保左边成绩高的同学铅笔数更多 for (int i = n - 2; i >= 0; --i) { if (scores[i] > scores[i + 1]) { pencils[i] = max(pencils[i], pencils[i + 1] + 1); } } // 计算总共需要的铅笔数 int totalPencils = 0; for (int i = 0; i < n; ++i) { totalPencils += pencils[i]; } cout << totalPencils << endl; return 0; } ``` 代码解释: 1. 输入处理: - 首先读取同学的数量`n`。 - 然后读取一行包含同学成绩的字符串,使用`split`函数将其按逗号分割成整数向量`scores`。 2. 初始化铅笔数: - 创建一个长度为`n`的向量`pencils`,并将每个元素初始化为1,表示每个同学至少有1支铅笔。 3. 从左到右遍历: - 从第二个同学开始,如果当前同学的成绩比前一个同学高,则当前同学的铅笔数为前一个同学的铅笔数加1。 4. 从右到左遍历: - 从倒数第二个同学开始,如果当前同学的成绩比后一个同学高,则当前同学的铅笔数取当前值和后一个同学铅笔数加1的最大值。 5. 计算总铅笔数: - 遍历`pencils`向量,将所有元素相加得到总共需要的铅笔数。 6. 输出结果: - 输出总共需要的铅笔数。 复杂度分析: - 时间复杂度:$O(n)$,其中`n`是同学的数量。需要遍历两次成绩数组。 - 空间复杂度:$O(n)$,主要用于存储每个同学的铅笔数。 ######[AI问答 | 724点数解答 | 2025-12-06 20:58:32]
- 深入解析洛谷打卡系统:规则揭秘与代码实现(字节豆包 | 316点数解答 | 2025-11-16 19:45:59)104
- 易语言读取文本文件并显示到超级列表框:代码示例与注意要点(DeepSeek | 571点数解答 | 2025-08-23 20:54:40)224
- 易语言:读取并显示特定文本到超级列表框,还能增加新数据的方法与要点(DeepSeek | 1317点数解答 | 2025-08-23 20:58:40)230
- 含不规则缺陷原材料的最优切割方案建模与损失率、利用率计算(DeepSeek | 2367点数解答 | 2025-05-10 23:47:30)261
- mallshop商城网站:数据库设计与强大业务功能全揭秘(GPT | 257点数解答 | 2024-12-09 14:08:15)275
- 文具王国跑步赛:橡皮为何成最慢“选手”?原因超搞笑!(字节豆包 | 39点数解答 | 2025-06-10 10:02:25)112
- C3期末:精准求解 3 - 20 范围内数列第 k 项值及注意要点(字节豆包 | 242点数解答 | 2025-06-15 11:26:19)136
- C++求解:查找3 - 20项数列第k项值及注意要点(字节豆包 | 325点数解答 | 2025-06-15 11:27:11)155
- 工程师必备:十大APP性能优化方案大揭秘(百度文心 | 300点数解答 | 2023-11-09 18:31:04)330
- 班级分组难题:最少修改多少同学 id 实现公平配对?(DeepSeek | 1604点数解答 | 2026-01-11 13:28:28)55
- 巧用算法!求解班级分组中最少更改学生ID数的难题(DeepSeek | 2266点数解答 | 2026-01-13 17:47:37)40
- 班级活动分组难题:最少修改多少学生 ID 实现公平分组?(DeepSeek | 1692点数解答 | 2026-01-13 17:49:24)34