博弈论 nim游戏

这可能是最简单的博弈论了;

思路上

我们需要假设状态p是先手的必胜态,那它也是后手的必败态;q是先手的必败态,它也是后手的必胜态;

当所有石子异或和为0时,先手不管怎么取,异或和都不会再为0了,如果异或和再为0那么肯定有之前的异或和肯定就不为0了(与之前的矛盾);而此时后手这个时候异或和不为0了,他不管怎么取一定可以再次把异或和取成0(由于最大的一堆石子的最高位(二进制下)一定大于等于异或和),所以一定能取走某些个是这个最大堆的石子个数与异或和一致);这样石子再不断减少,最后石子为0,可以证明这是q状态,也就是先手的必败态,后手的必胜态;

当石子异或和不为0,就是p状态啦;

#include
#include
#include
#include
#include
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"<

洛谷评分提高+省选-,感觉不至于 

 

你可能感兴趣的:(博弈论 nim游戏)