【题解】Codeforces 2163 A Souvlaki VS. Kalamaki

题目链接

Codeforces 2163 A Souvlaki VS. Kalamaki

题目大意

一个博弈问题,给定一个长度为 \(n\) 的序列,允许 \(S\) 在游戏开始前随意排列,游戏开始后, \(S\) 先手, \(K\) 后手,对于第 \(i\) 轮,允许玩家交换 \(a_i\)\(a_{i+1}\) 或者什么都不做,当游戏结束时,序列非降序, \(S\) 胜利,否则 \(K\) 胜利,两个人均用最优策略,判断 \(S\) 是否有获胜可能。

思路

本场比赛比较考察观察,而我注意力惊人地差,15分钟才过。

经过简单观察,可以发现,如果 \(K\) 操作时,他面对两个不同的数,一定有办法破坏非降序,所以 \(S\) 要获胜, \(K\) 操作的任意一轮必须都面对两个相同的数。

然后我急着开始编码了,弄了个桶统计重复元素对数,然而五分钟后,我发现这是不对的。

再次观察,可以发现,即便满足了上面这个条件,仍有限制,即 \(S\) 必须得有办法把原始数据整有序,然后我想了10分钟怎么构造。

事实上没那么复杂,我们只需要一开始把序列排序,然后检查 \(K\) 操作时是否两个数相等即可。

AC代码

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 128;

int a[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int T;
    cin>>T;
    while(T--) {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) {
            cin>>a[i];
        }
        sort(a+1, a+1+n);
        bool flag = true;
        for(int i=2;i<n;i+=2) {
            if(a[i] != a[i+1]) {
                flag = false;
                break;
            }
        }
        if(flag) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
}

时间复杂度 \(O(T \cdot n log n)\)

posted @ 2025-11-11 10:27  MistryNihilityn  阅读(22)  评论(0)    收藏  举报