BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论

题目大意:反Nim游戏,即取走最后一个的人输

首先状态1:如果所有的堆都是1,那么堆数为偶先手必胜,否则先手必败

然后状态2:如果有两个堆数量相同且不为1,那么后手拥有控场能力,即:

若先手拿走一堆,那么后手可以选择将另一堆留下1个或者全拿走,使这两堆最终只剩1个或0个;

若先手将一堆拿剩一个,那么后手可以选择将另一堆留下一个让先手拿或全拿走,使这两堆最终只剩1个或0个;

若先手将一堆拿走一部分,那么后手可以将另一堆同样拿走一部分,然后同上

状态3:若Xor!=0 那么先手可以先拿走一部分让Xor=0 然后同状态2先手必胜 否则先手必败

※鉴于本人过于沙茶,以上内容仅存在参考价值,无法证明正确性,欢迎指正

于是若所有堆全是1 Xor==0先手必胜 否则后手必胜

若有堆不是1 Xor==0后手必胜 否则先手必胜

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
bool Calculate()
{
	int i,x,xor_sum=0;
	bool flag=1;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		if(x^1) flag=0;
		xor_sum^=x;
	}
	if(flag)
		return !xor_sum;
	else
		return xor_sum;
}
int main()
{
	int T,i;
	for(cin>>T;T;T--)
	{
		if( Calculate() )
			puts("John");
		else
			puts("Brother");
	}
}
时间: 2024-11-03 05:31:19

BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论的相关文章

BZOJ.1022.[SHOI2008]小约翰的游戏John(博弈论 Anti-Nim)

题目链接 Anti-Nim游戏: 先手必胜当且仅当: 1.所有堆的石子数为1,且异或和为0 2.至少有一堆石子数>1,且异或和不为0 简要证明: 对于1:若异或和为1,则有奇数堆:异或和为0,则有偶数堆.比较显然. 对于2:(1)对于只有一堆石子数>1的情况(异或和一定不为0),先手可以操作这堆石子 将场面变为奇数堆个数都为1的石子堆 (2)对于至少有两堆石子数>1的情况: 若异或和=0,先手必败 若异或和!=0,先手必胜 类似Nim的证明,若异或和=0,则怎样操作都会使异或和!=0:若

bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1189  Solved: 734[Submit][Status] Description 小 约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意 多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优

BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】

Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误.小约翰一怒之前请你来做他的参谋.自然,你应该先写一个程序,预测一下谁将获得游戏的胜利. Input 本题的输入由多组数据组成,第一行包括一个整数T

BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)

Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 2003[Submit][Status][Discuss] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪

bzoj 1022: [SHOI2008]小约翰的游戏John

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int T,a[100],n; 5 int main() 6 { 7 scanf("%d",&T); 8 for(;T;T--) 9 { 10 int a1=0,kg=0; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 { 14 scanf(&q

1022: [SHOI2008]小约翰的游戏John

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1322  Solved: 829[Submit][Status] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优势,

1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2709  Solved: 1726[Submit][Status][Discuss] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先

BZOJ1022 [SHOI2008]小约翰的游戏John (博弈论)

看到博弈论,大力推一下sg,发现和NIM一样嘛,sg(x)=x,然后发现sg(1)和sg(0)有点怪,然后发现sg带进去不对,发现如果石子全是1的话就不对,然后一脸懵逼,开始质疑sg的正确性,找到了题解发现是sj函数!!果然是我土鳖了,看了一下论文,这个问题是Anti-NIM游戏,是由JZH提出的结论,结论就是按照NIM游戏sg函数(sg[x]=x)推分类讨论一下. 1:如果存在一堆的sg大于1,如果整个游戏的sg不等于0那么先手必胜. 2:如果不存在一堆的sg大于1,如果整个游戏的sg等于0那

【BZOJ 1022】 [SHOI2008]小约翰的游戏John

1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1375  Solved: 865 [Submit][Status] Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一粒石子的人算输.小约翰相当固执,他坚持认为先取的人有很大的优