CF1972B.Coin Games-博弈

yoshinow2001發表於2024-05-03

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

相關文章