2 条题解
-
1
出题人题解
设在所有比赛结束后,进行 轮操作之前,SailTuT 的 Rating 为 ,Yue_chen 的 Rating 为 。
每一轮操作,SailTuT 的目标是尽可能减小 ,Yue_chen 的目标是尽可能扩大 。
又因为 Rating 可以为负数,所以,实际上初始 Rating = 1000 是无效信息,我们只需要关注双方 Rating 的差值。我们设 ,,当且仅当操作完成后 ,SailTuT 能取得胜利。
所以每一轮的操作应当是这样的:
-
轮到 SailTuT 操作时,减掉最不利的一轮,即 最大的一轮,然后 ,特别地,如果不存在 ,则不要操作;
-
轮到 Yue_chen 操作时,减掉最不利的一轮,即 最小的一轮,然后 ,特别地,如果不存在 ,则不要操作;
代码如下(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
- 上传者