1. 程式人生 > >博弈論 nim遊戲

博弈論 nim遊戲

這可能是最簡單的博弈論了;

思路上

我們需要假設狀態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;
	} 
	
	
}

洛谷評分提高+省選-,感覺不至於