HDU 1907 John

Problem Description

Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that each player has to eat at least one M&M during his turn. If John (or his brother) will eat the last M&M from the box he will be considered as a looser and he will have to buy a new candy box.

Both of players are using optimal game strategy. John starts first always. You will be given information about M&Ms and your task is to determine a winner of such a beautiful game.

Input

The first line of input will contain a single integer T – the number of test cases. Next T pairs of lines will describe tests in a following format. The first line of each test will contain an integer N – the amount of different M&M colors in a box. Next line will contain N integers Ai, separated by spaces – amount of M&Ms of i-th color.

Constraints:
1 <= T <= 474,
1 <= N <= 47,
1 <= Ai <= 4747

Output

Output T lines each of them containing information about game winner. Print “John” if John will win the game or “Brother” in other case.

Sample Input

2
3
3 5 1
1
1

Sample Output

John
Brother

思路

每次取不少于1个,谁最后取完输。
S为必败态,T为必胜态,0代表没有充裕堆(个数大于1),1代表充裕堆个数为1,2代表充裕堆个数大于1,那么一共有S2,T2,T1,S0,T0态。没有S1态,因为只有一个充裕堆,如果孤单堆的个数为偶数,那么这个充裕堆就去得只剩一个,孤单堆的个数就变为一个,如果孤单堆的个数为奇数,充裕堆全取完,孤单堆还是奇数。
转换可以发生这几种S2->T2 S2->T1 T2->S2 T1-S1 T0->S0 S0->T0
最后的过程就是S2->T2->S2->……->T2->S1->S0->T0->……->S0->T0
总结如果没有充裕堆,那么堆数为偶数先手赢;如果有充裕堆,那么异或和不为0先手赢

代码

#include<iostream>
using namespace std;

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		int a[51],s=0,cnt=0;
		for(int i=1;i<=n;i++)
		{
    
    
			cin>>a[i];
			if(a[i]>1)
				cnt=1;
			s^=a[i];
		}
		if(!cnt&&!s)
			cout<<"John"<<endl;
		else if(cnt&&s)
			cout<<"John"<<endl;
		else
			cout<<"Brother"<<endl;
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/m0_54621932/article/details/113996372