1 条题解

  • 0
    @ 2026-5-19 20:58:04

    题意简述

    nn 块地,每块有 aia_i 株蒲公英。
    初始割草机关闭。
    访问每块地时:

    • aia_i 为奇数,先切换割草机状态。
    • 若割草机开启,则收割 aia_i 株。

    求最优顺序下的最大收割总数。


    结论

    设奇数地个数为 kk,将奇数地从小到大排序为 o1o2oko_1 \le o_2 \le \dots \le o_k

    最大收益为: [ \text{ans} = \left( \sum_{i=1}^n a_i \right) - \sum_{i=1}^{\lfloor k/2 \rfloor} o_i ]


    解释

    • 所有偶数地最终都能被收割。
    • 奇数地中,排序后位置为偶数(第 2,4,6,2,4,6,\dots)的被收割,位置为奇数的被“浪费”。
    • 浪费的奇数地正好是最小的 k/2\lfloor k/2 \rfloor 个。
    • 所以从总和里减去这些最小的奇数地即可。

    示例验证

    例 2:[4,2,1,6][4,2,1,6],奇数地 [1][1]k=1k=11/2=0\lfloor 1/2 \rfloor =0,总和 130=1313-0=13
    例 3:[109,1091,109,1091][10^9, 10^9-1, 10^9, 10^9-1],奇数地 [1091,1091][10^9-1, 10^9-1],排序后 [999999999,999999999][999999999, 999999999]2/2=1\lfloor 2/2 \rfloor =1,去掉最小的一个 999999999999999999,总和 =4×1092999999999=2999999999= 4\times10^9 - 2 - 999999999 = 2999999999


    代码

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            vector<ll> odd;
            ll sum = 0;
            for (int i = 0; i < n; ++i) {
                ll x;
                cin >> x;
                sum += x;
                if (x & 1) odd.push_back(x);
            }
            sort(odd.begin(), odd.end());
            for (int i = 0; i < (int)odd.size() / 2; ++i) {
                sum -= odd[i];
            }
            cout << sum << '\n';
        }
        return 0;
    }
    
    • 1

    信息

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