小清新博弈,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;
}