B. 硬币游戏[CF1972B]

    传统题 1000ms 256MiB

硬币游戏[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;
}

提高测试:div2难度(时间3.5h)

未参加
状态
已结束
规则
XCPC
题目
7
开始于
2024-8-23 8:30
结束于
2024-8-23 12:00
持续时间
3.5 小时
主持人
参赛人数
11