POJ - 3480 John

https://vjudge.net/problem/POJ-3480

经典的Nim博弈的一点变形。设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,
设状态
S0:a1a2…an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败)。
S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜->就是构造S0)。

T0:a1异或到an=0 &&充裕堆=0,先手必胜(只有偶数个孤独堆,先手必胜)。

S2:a1a2…an!=0&&充裕堆>=2。
T2:a1a2…an=0&&充裕堆>=2。
这样的话我们用S0,S1,S2,T0,T2将所有状态全部表示出来了,并且S0先手必败,S1、T0先手必胜,那么我们只需要对S2和T2的状态进行分析就行了。
(a)S2可以取一次变为T2。
(b)T2取一次可变为S2或者S1。因为S1是先手必胜态,那么根据a,b这两个转换规则,我们就能得知S2也是先手必胜,T2是先手必败。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    
    
	ios::sync_with_stdio(false);
	int t,n,x;
	cin>>t;
	while(t--)
	{
    
    
		cin>>n;
		int r=0,f=0;
		for(int i=0;i<n;i++)
		{
    
    
			cin>>x;
			if(x>1) f=1;
			r^=x;
		}
		if((!r && f) || (r && !f))
			cout<<"Brother\n";
		else
			cout<<"John\n";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52341477/article/details/120101240