CF1972B.Coin Games-博弈

小清新博弈,link:https://codeforces.com/contest/1972/problem/B
题意:\(n\) 枚硬币排成一个,轮流操作,每次拿走一个向上的硬币,然后翻转左右两边的状态(如果只剩 \(2\) 枚硬币,左右两边相当于是同一个硬币,那就不翻转),不能操作的输。


每次操作会让 U 少一个,考虑左右两边的情况,UxU->DxD,UxD->DxU,DxD->UxUU个数的奇偶性并不会因为翻转而改变,因此每次操作必然会让 U 奇偶性改变一次,最终是偶数,直接判 U 的个数即可。

感觉是个挺有意思的博弈,刚开始的时候想的是寻找 \(U-D\) 之类的特征,没找出来,手摸了下对左右的影响才发现。这种题大概是需要一定的直觉了,看完题目会很自然地意识到拿走 \(U\) 会让其减少一个,自然会去找奇偶性之类的特征,但具体观察谁的奇偶性,有时候确实要想一下~

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
int main(){
    int tc;cin>>tc;
    while(tc--){
        int n;
        string s;
        cin>>n>>s;
        bool ok=0;
        rep(i,0,n-1)if(s[i]=='U')ok^=1;
        if(ok)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
posted @ 2024-05-03 04:59  yoshinow2001  阅读(40)  评论(0编辑  收藏  举报