CF1972B.Coin Games-博弈
小清新博弈,link:https://codeforces.com/contest/1972/problem/B
题意:\(n\) 枚硬币排成一个圈,轮流操作,每次拿走一个向上的硬币,然后翻转左右两边的状态(如果只剩 \(2\) 枚硬币,左右两边相当于是同一个硬币,那就不翻转),不能操作的输。
每次操作会让 U
少一个,考虑左右两边的情况,UxU->DxD
,UxD->DxU
,DxD->UxU
,U
个数的奇偶性并不会因为翻转而改变,因此每次操作必然会让 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;
}