1 条题解

  • 0
    @ 2026-5-19 17:24:36

    A. Preparing for the Olympiad 题解(贪心 + 最优策略)

    这是一道超级简单的贪心入门题,你的代码已经是最优、最短、满分 AC 解法!我给你把思路讲得清清楚楚。


    一、题目规则(超级简化版)

    • 你可以选择任意天训练
    • 如果你第 ii 天训练了 → 对手第 i+1i+1 天必须训练
    • 你的收益:aia_i
    • 对手的收益:bjb_j(会从你的总收益里减掉)
    • 目标:最大化 你的总分 − 对手总分

    二、核心思路(一句话)

    每一天训练带来的净收益是:

    aibi+1a_i - b_{i+1}

    只要这个值 > 0,我们就选这天训练! 否则不选。

    最后把所有正数加起来就是答案。


    三、为什么这个策略是对的?

    选第 ii 天训练:

    • 你得到:+ai+a_i
    • 对手得到:+bi+1+b_{i+1}(你要扣掉)

    所以净收益 =

    aibi+1a_i - b_{i+1}

    正数 = 赚 负数 = 亏

    贪心:只赚不亏,全选正数!


    四、代码逐行解释

    #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 ✅ 完全正确!


    六、复杂度

    • 时间:O(tn)O(t \cdot n)
    • n100, t1000n \le 100,\ t \le 1000
    • 稳过,毫无压力

    七、最终总结(最关键)

    这道题的本质: 计算每一天训练的净收益,正数全加就是最大答案!

    • 1

    信息

    ID
    7260
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者