洛谷 P4279 [SHOI2008]小约翰的游戏
小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输。
小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下谁将获得游戏的胜利。
简明题意就是Nim游戏取到最后一个石子的人输
这个题是Anti-Nim
我们先讨论最简单的胜负
1:只有一堆石子且个数为\(1\),则后手胜
2:每一堆石子都是\(1\),那么奇数个石子后手胜,偶数个石子先手胜
3:只有一堆石子不是\(1\),其余每堆石子都是\(1\),那么先手一定可以选择取\(n-1\)或\(n\)个来转移到2且为奇数的情况,所以先手胜
4:正常情况,先手只要保证能通过选石子选到3就必胜,也就是自己选到最后一堆石子,那么就是Nim游戏了
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int T,n,ans,sm;
int main()
{
scanf("%d",&T);
int x;
while (T--)
{
ans = 0;
sm = 0;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
scanf("%d",&x),ans ^= x,sm += x;
if (sm == n)
{
if (sm % 2 == 1)
printf("Brother\n");
else
printf("John\n");
}
else
if (ans)
printf("John\n");
else
printf("Brother\n");
}
return 0;
}