您的位置:首页 > 其它

hdu1907 John--尼姆博弈

2016-12-22 13:57 316 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1907

分析:

参考http://www.cnblogs.com/jiangjun/archive/2012/11/01/2749937.html

注意此题是最后取光的是loser。

现在有两个人分别是:先手–pre和后手–nex;

假设现在有n堆,每堆都有若干元素。

这些堆有的只有1个元素,有的堆的元素大于1个,现在把只有一个元素的堆放在左边,元素个数大于1的堆放在右边。

在两人博弈的时候,元素个数大于1的堆,最终,我说的是最终,无外乎变为0或者1,变为1的就放在左边;变为0的直接消失了,不管它。

那么最后一定会出现这样的局面:左边有m堆,m>=0,每个堆的元素个数都是1;右边只有一个堆,元素个数大于1。

现在一个人来取,那么根据m的奇偶性来决定右边的这个堆的剩余个数是0还是1。

AC代码:

#define _CRT_SECURE_NO_DEPRECATE

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 1000000000
#define EPS 1e-6
using namespace std;

int t;
int n;
int a[50];

int main()
{
scanf("%d", &t);
while (t--)
{
bool flag = 0;
int ans = 0;

scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
ans ^= a[i];
if (a[i] != 1)
flag = 1;
}

if (flag)
{
if (ans == 0)
printf("Brother\n");
else
printf("John\n");
}
else
{
if (n % 2 == 0)
printf("John\n");
else
printf("Brother\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: