51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
首先,51nod的那道题就是最简单的尼姆博弈问题。
尼姆博弈主要就是判断奇异局势,现在我们就假设有三个石子堆,最简单的(0,n,n)就是一个奇异局势,因为无论先手怎么拿,后手总是可以在另一堆里拿走相同的石子数。
再看另外一个奇异局势(1,2,3):
①如果先手拿第一个石子堆,那么后手可以形成(0,2,2)的局势,先手必败。
②如果先手拿第二个石子堆的1个石子,那么后手可以形成(1,1,0)的局势,先手必败。
③如果先手拿第二个石子堆的2个石子,那么后手可以形成(1,0,1)的局势,先手必败。
后面的同理分析即可。
现在我们需要考虑的是如何判断一个局势是否是奇异局势?
奇异局势的判断就是所有堆的值异或起来,如果最后等于0就是奇异局势,如果不是则不是奇异局势(异或的原理就是对于二进制的每一位进行运算,如果某一位最后为0,那么就说明该位上有偶数次1出现,偶数次说明什么呢?说明先手在某堆石子操作后,后手总能在另一堆石子里去做相对应的操作)。
那么如果先手面对的是非奇异局势,也只需要一步就可以变成奇异局势,将所有堆的值异或起来(除去最大堆),再用最大堆-该异或值,就是所拿石子数。
#include<cstdio>
using namespace std; int n; int main()
{
while(~scanf("%d",&n))
{
int ans=;
for(int i=;i<n;i++)
{
int x; scanf("%d",&x);
ans^=x;
}
if(ans) puts("A");
else puts("B");
}
return ;
}
接下来介绍一下anti-nim游戏,它的话就是取到最后一个石子输。
对于这种题目,它有一个专门的SJ定理:(具体的话就参见论文吧)
对于一个Anti-Nim游戏,只要有以下两条条件之一,先手必胜:
1.游戏的总SG函数为0且任意子游戏的SG函数不超过1;
2.游戏的总SG函数不为0且至少存在一个子游戏的SG函数超过1。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = + ; int n; int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int sum=;
scanf("%d",&n);
bool flag=false;
for(int i=;i<=n;i++)
{
int x; scanf("%d",&x);
sum^=x;
if(x>) flag=true;
}
if((!sum && !flag) || (sum && flag)) puts("John");
else puts("Brother");
}
return ;
}
51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)的更多相关文章
- bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏
		
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1189 Solved: 734[Submit][ ...
 - BZOJ 1022 [SHOI2008]小约翰的游戏John
		
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1635 Solved: 1036[Submit] ...
 - BZOJ 1022 [SHOI2008]小约翰的游戏John AntiNim游戏
		
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1475 Solved: 932[Submit][ ...
 - BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
		
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 2003[Submit][Status][Discuss] Descripti ...
 - BZOJ 1022: [SHOI2008]小约翰的游戏John【anti-SG】
		
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...
 - BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
		
题目大意:反Nim游戏,即取走最后一个的人输 首先状态1:假设全部的堆都是1,那么堆数为偶先手必胜,否则先手必败 然后状态2:假设有两个堆数量同样且不为1,那么后手拥有控场能力,即: 若先手拿走一堆, ...
 - BZOJ.1022.[SHOI2008]小约翰的游戏John(博弈论 Anti-Nim)
		
题目链接 Anti-Nim游戏: 先手必胜当且仅当: 1.所有堆的石子数为1,且异或和为0 2.至少有一堆石子数>1,且异或和不为0 简要证明: 对于1:若异或和为1,则有奇数堆:异或和为0,则 ...
 - BZOJ 1022: [SHOI2008]小约翰的游戏John [SJ定理]
		
传送门 $anti-nim$游戏,$SJ$定理裸题 规定所有单一游戏$sg=0$结束 先手必胜: $1.\ sg \neq 0,\ 某个单一游戏sg >1$ $2.\ sg = 0,\ 没有单一 ...
 - bzoj 1022: [SHOI2008]小约翰的游戏John【anti-nim】
		
如果全是1,那么n是奇数先手必败 否则,xor和为0先手必败 证明见 https://www.cnblogs.com/Wolfycz/p/8430991.html #include<iostre ...
 
随机推荐
- tensorflow学习5----变量管理
			
---恢复内容开始--- 前面,读书笔记用加入正则化损失模型效果带来的提升要相对显著. 变量管理: 目的:当神经网络的结构更加复杂,参数更多的时候,就需要一个更好的方式来管理神经网络中的参数. 解决方 ...
 - 干货 | JavaScript内存空间详解
			
JS栈内存与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所以对于前端开发 ...
 - php Allocator Jemalloc TCMalloc那个内存分配器比较好?
			
php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...
 - 专题8:javascript函数详解
			
函数是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值. 函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代 ...
 - PLSQL 问题小记
			
问题1:在一个拼写长字符串的函数中,若出现ora-06502或者ora-06512的错误,则有可能是在拼串的过程中,数据类型的隐式转换出了问题,如:字符类型转为数字,此时会出现错误. 解决方案:在拼串 ...
 - java日志
			
http://blog.csdn.net/u013628152/article/details/43538299 http://blog.csdn.net/isea533/article/detail ...
 - 关于nginx配置虚拟主机
			
前提:我的虚拟主机的外网ip为111.231.226.228(是云服务器哈) 本地测试环境为windows7(修改本地的hosts文件) 步骤:(安装nginx可以看看我文章“linux ng ...
 - Vue小案例 之 商品管理------批量删除与商品数量的调整
			
通过索引进行删除,进行测试,是否获取其索引: 测试效果: 测试代码,在vue中定义一个空的数组,以便后面进行数据的绑定: data:{ imgUrl:'../res/images/', imgName ...
 - Solr索引配置
			
Solr主配置文件 schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的.主要包括FieldTypes.Fields和其他的一些缺省 ...
 - socket - option编程:SO_REUSEADDR
			
网友vmstat多次提出了这个问题:SO_REUSEADDR有什么用处和怎么使用.而且很多网友在编写网络程序时也会遇到这个问题.所以特意写了这么一篇文章,希望能够解答一些人的疑难. 其实这个问题在Ri ...