【题解】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)\)

浙公网安备 33010602011771号