2 条题解

  • 1
    @ 2025-10-13 16:24:07

    出题人题解

    设在所有比赛结束后,进行 tt 轮操作之前,SailTuT 的 Rating 为 SaS_a,Yue_chen 的 Rating 为 SbS_b

    每一轮操作,SailTuT 的目标是尽可能减小 SbSaS_b-S_a ,Yue_chen 的目标是尽可能扩大 SbSaS_b-S_a

    又因为 Rating 可以为负数,所以,实际上初始 Rating = 1000 是无效信息,我们只需要关注双方 Rating 的差值。我们设 di=biaid_i=b_i-a_ires=SbSares=S_b-S_a,当且仅当操作完成后 res<0res<0 ,SailTuT 能取得胜利。

    所以每一轮的操作应当是这样的:

    • 轮到 SailTuT 操作时,减掉最不利的一轮,即 did_i 最大的一轮,然后 res=resdires = res-d_i,特别地,如果不存在 di>0d_i>0,则不要操作;

    • 轮到 Yue_chen 操作时,减掉最不利的一轮,即 did_i 最小的一轮,然后 res=resdires = res-d_i,特别地,如果不存在 di<0d_i<0,则不要操作;

    代码如下(C++):

    #include <bits/stdc++.h>
    using namespace std;
    
    using ll = long long;
    
    void solve() {
        int n, t;
        cin >> n >> t;
        vector<int> a(n + 1), b(n + 1);
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        vector<int> dis(n + 1);
        ll sumdis = 0;
        for (int i = 1; i <= n; i++) {
            cin >> b[i];
            dis[i] = b[i] - a[i];
            sumdis += dis[i];
        }
        if (t == 0) {                      // 坑点:操作数为 0
            cout << (sumdis < 0 ? "YES" : "NO") << "\n";
            return;
        }
        sort(dis.begin() + 1, dis.end());  // 进行排序,方便找最值
        int spos = n, ypos = 1;            // 当前 d 的最值所在位置
        for (int i = 1; i <= t; i++) {
            if (i & 1) {                   // SailTuT 操作
                if (dis[spos] >= 0) {      // 确保删除操作对自己有利,写 > 0 亦可
                    sumdis -= dis[spos--]; // spos-- 顺便更新了 spos 位置
                }
            } else {                       // Yue_chen 操作
                if (dis[ypos] <= 0) {
                    sumdis -= dis[ypos++];
                }
            }
        }
        cout << (sumdis < 0 ? "YES" : "NO") << "\n";
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
    
        int __t = 1;
        cin >> __t;
        while (__t--) {
            solve();
        }
    
        return 0;
    }
    

    信息

    ID
    1099
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    42
    已通过
    8
    上传者