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;
    }
    
    • 0
      @ 2025-10-13 20:38:55

      SailTuT VS. Yue_chen

      偶像对决吗有点意思 题目大意为去掉某些场次的影响判断最后帆神的rating是否可以严格大于肖神,那么可以将对应场次的帆神rating变化值与肖神rating变化值取差,并从小到大排序。对于帆神,当然要将自己提rating比肖神少的场次进行unrated,即将判断数组从左往右第一个小于0的值去掉,否则不操作;而对于肖神则正好相反,即尝试去掉最大的大于零的值。最后比较剩余元素的和是否大于0即可

      参考代码(python)

      from sys import stdin,setrecursionlimit
      from math import inf,ceil,sqrt
      from collections import Counter,deque
      
      for _ in range(int(stdin.readline())):
          n,t=[int(_) for _ in stdin.readline().split()]
      
          a=[int(_) for _ in stdin.readline().split()]
          b=[int(_) for _ in stdin.readline().split()]
      
          c=[a[i]-b[i] for i in range(n)]
          c.sort()
      
          l,r=0,n-1
          for i in range(1,t+1):
              if i&1:
                  if c[l]<0:
                      l+=1
              else:
                  if c[r]>0:
                      r-=1
          s=0
          for i in range(l,r+1):
              s+=c[i]
          if s>0:
              print('YES')
          else:
              print('NO')
      
      
      • 1

      信息

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