硬币游戏[CF1972B]
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
Description
[题意]桌子上有$n$枚硬币围成一个圆圈,每枚硬币要么朝上,要么朝下。两名玩家轮流操作。
在每次操作中,玩家选择一枚正面朝上的硬币,取出硬币并翻转与其相邻的两枚硬币。
如果(操作前)只剩下两枚硬币,则取出一枚,另一枚不翻转(因为会翻转两次)。
如果(操作前)只剩下一枚硬币,则不会翻转任何硬币。如果(操作前)没有正面朝上的硬币,玩家就输了。
两人做的都是最优决策,请问先手是否会获胜。
输入一个$T (1 \le T \le 100)$,是样例的组数。
接下来一个整数$n (1 \le n \le 100)$。
然后是$n$个大写字母,为$U$(正面朝上)或$D$(反面朝上)。
[样例输入]
3
5
UUDUD
5
UDDUD
2
UU
[样例输出]
YES
NO
NO
在第一组样例中:
假设$A$先手,$B$后手
1.$A$拿走第一个硬币,原字母列变为$DDUU$。
2.$B$拿走最后一个硬币,原字母列变为$UUD$。
3.$A$拿走第一个硬币,原字母列变为$UU$。
4.$B$拿走第一个硬币,原字母列变为$U$。
5.$A$拿走唯一一个硬币,原字母列变为空。
可以证明无论怎样都是先手获胜。
Hint
#include<bits/stdc++.h>
using namespace std;
const int N=110;
char s[N];
int main(){
//细节稍多,但没↘有→问↗题
int T; scanf("%d", &T);
while(T--){
int n; scanf("%d", &n);
scanf("%s", s+1); int sum=0;
for(int i=1; i<=n; i++) if(s[i]=='U') sum++;
/*
分几种情况:
1.当n为1
s[1]为'U'时先手赢
s[1]为'D'时先手输
2.当n为2
s[1]和s[2]不相同,先手删掉'U'即可获胜
s[1]和s[2]相同都为'U',先手输
s[1]和s[2]相同都为'D',先手输
3.当n>2
设要删掉的是第i个,则有
s[i-1]和s[i+1]不相同,删掉后'U'的数量减少1
s[i-1]和s[i+1]相同都为'U',删掉后'U'的数量减少3
s[i-1]和s[i+1]相同都为'D',删掉后'U'的数量增加1
我们可以发现如果当前'U'的数量为奇数,先手必胜
*/
if(sum&1) printf("YES\n");
else printf("NO\n");
}
return 0;
}