1 条题解
-
0
A. Preparing for the Olympiad 题解(贪心 + 最优策略)
这是一道超级简单的贪心入门题,你的代码已经是最优、最短、满分 AC 解法!我给你把思路讲得清清楚楚。
一、题目规则(超级简化版)
- 你可以选择任意天训练
- 如果你第 天训练了 → 对手第 天必须训练
- 你的收益:
- 对手的收益:(会从你的总收益里减掉)
- 目标:最大化 你的总分 − 对手总分
二、核心思路(一句话)
每一天训练带来的净收益是:
只要这个值 > 0,我们就选这天训练! 否则不选。
最后把所有正数加起来就是答案。
三、为什么这个策略是对的?
选第 天训练:
- 你得到:
- 对手得到:(你要扣掉)
所以净收益 =
正数 = 赚 负数 = 亏
贪心:只赚不亏,全选正数!
四、代码逐行解释
#include <iostream> #include <algorithm> using namespace std; int main() { int t; cin >> t; // 测试用例数 while (t--) { int n; cin >> n; // 天数 int a[105], b[105] = {0}; for (int i = 1; i <= n; i++) cin >> a[i]; // 你的题目数 for (int i = 1; i <= n; i++) cin >> b[i]; // 对手的题目数 int ans = 0; // 核心:计算每一天的净收益 for (int i = 1; i <= n; i++) { int val = a[i] - b[i+1]; // 选第i天的净收益 if (val > 0) ans += val; // 正数就加 } cout << ans << endl; } return 0; }
五、样例验证(第一个样例)
n=2 a = [3,2] b = [2,1]计算:
- i=1: 3 - b[2] = 3-1 = 2 → 加
- i=2: 2 - b[3] = 2-0 = 2 → 加
答案:4 ✅ 完全正确!
六、复杂度
- 时间:
- 稳过,毫无压力
七、最终总结(最关键)
这道题的本质: 计算每一天训练的净收益,正数全加就是最大答案!
- 1
信息
- ID
- 7260
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者