John
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2577 Accepted Submission(s): 1400
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
Sample Output
Source
Southeastern Europe 2007
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1907
近期在看博弈系列,搞完了巴什博弈、威佐夫博弈,接下来就是这个尼姆博弈。
这一系列博弈类型可以概括为:
巴什博弈:从一堆石子中拿石子,一次拿1~m个。
威佐夫博弈:从两堆石子中拿石子,方法①任选一堆石子拿k个石子(k≥1),方法②从两堆石子中拿相同数量的石子(当然所拿的数要≥1)
尼姆博弈:从三堆石子中拿石子,每次任选一堆拿任意数目(≥1)的石子。
这些当然是谁先那光,谁获胜。
尼姆博弈解法,和二进制有关。
反正我不知道他们怎么推得,只会用。o(╯□╰)o。。。
给出的数 用异或加起来,若等于0,则为奇异态(必胜态)。
这道题有些不一样,如果John吃的是某个盒子最后一颗,那就判定John为败。
所以,这道题分为两种情况讨论:
①若所有堆的数量都为1。则根据奇偶来判断谁胜。
②其他情况,将所有数据异或起来,判断是否为奇异态。
/**************************************
***************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : John *
*Source: hdu 1907 *
* Hint : 尼姆博弈 *
***************************************
**************************************/
#include <iostream>
#include <algorithm>
using namespace std;
int arr[48];
int main()
{
int t,n,i,temp;
cin>>t;
while( t-- )
{
cin>>n;
for(i=0;i<n;++i)
cin>>arr[i];
sort(arr,arr+n);
// 如果全是1,按照奇偶判断谁获胜
if( arr[n-1]==1 )
{
if( n&1 ) cout<<"Brother"<<endl;
else cout<<"John"<<endl;
continue;
}
// 异或加起来
temp=arr[0]^arr[1];
for(i=2;i<n;++i)
temp^=arr[i];
if( temp==0 ) cout<<"Brother"<<endl;
else cout<<"John"<<endl;
}
return 0;
}