博弈論 nim遊戲
阿新 • • 發佈:2019-02-02
這可能是最簡單的博弈論了;
思路上
我們需要假設狀態p是先手的必勝態,那它也是後手的必敗態;q是先手的必敗態,它也是後手的必勝態;
當所有石子異或和為0時,先手不管怎麼取,異或和都不會再為0了,如果異或和再為0那麼肯定有之前的異或和肯定就不為0了(與之前的矛盾);而此時後手這個時候異或和不為0了,他不管怎麼取一定可以再次把異或和取成0(由於最大的一堆石子的最高位(二進位制下)一定大於等於異或和),所以一定能取走某些個是這個最大堆的石子個數與異或和一致);這樣石子再不斷減少,最後石子為0,可以證明這是q狀態,也就是先手的必敗態,後手的必勝態;
當石子異或和不為0,就是p狀態啦;
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> using namespace std; int read(){ char c=getchar(); int f=1; int x=0; while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*f; } int main(){ int t; cin>>t; while(t--){ int n; n=read(); int p=read(); int ans=p; for(int i=2;i<=n;i++){ int s=read(); ans^=s; } if(ans==0) cout<<"No"<<endl; else cout<<"Yes"<<endl; } }
洛谷評分提高+省選-,感覺不至於