HDU 2176 取(m堆)石子游戏 —— (Nim博弈)
如果yes的话要输出所有情况,一开始觉得挺难,想了一下也没什么。
每堆的个数^一下,答案不是0就是先取者必胜,那么对必胜态显然至少存在一种可能性使得当前局势变成必败的。只要任意选取一堆,把这堆的数目变成其他堆异或和即可,这样,它们异或一下就是0了(变成了必败态)。所以说,在这题就是,对任意一堆,变化以后的数目如果不大于这堆原来的数目,就是可能的第一次取的情况。代码如下:
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = + ;
int a[N];
int main()
{
int n;
while(scanf("%d",&n)== && n)
{
int temp = ;
for(int i=;i<=n;i++) {scanf("%d",a+i);temp^=a[i];}
if(temp == )
{
puts("No");
continue;
}
else
{
puts("Yes");
for(int i=;i<=n;i++)
{
int other = a[i]^temp;
int x = other^;
if(x <= a[i])
{
printf("%d %d\n",a[i],x);
}
}
}
}
}
同时,nim博弈转化成sg来理解也是没有问题的,每一堆的sg函数怎么计算的呢?显然对一堆,个数为n的话,因为可以取>=1的任意个数,所以n的后续态为0~n-1的连续整数,那么sg[n]=mex{sg[0],sg[1],...,sg[n-1]}。而sg[0]=0,sg[1]=mex{sg[0]}=mex{0}=1, sg[2]=mex{sg[0],sg[1]}=mex{0,1}=2... 因此可以递推得到sg[n]=n。所以根据sg胜利的条件是所有sg值相异或不为0,这正是nim博弈下胜利的条件。
HDU 2176 取(m堆)石子游戏 —— (Nim博弈)的更多相关文章
- HDU 2176 取(m堆)石子游戏(Nim)
取(m堆)石子游戏 题意: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,1 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 杭电 2176 取(m堆)石子游戏(博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2176 取(m堆)石子游戏 (尼姆博奕)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...
- HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly
HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...
- hdu 2176 取(m堆)石子游戏 (裸Nim)
题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...
- HDU 2176 取(m堆)石子游戏 尼姆博弈
题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...
- HDU 2176 取(m堆)石子游戏(尼姆博奕)
nim基础博弈 #include<stdio.h> #include<iostream> #include<cstring> #include<queue&g ...
- HDU 2177 取(2堆)石子游戏
取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- 怎样删除一条Cookie
删除Cookie的唯一方法是: 将Expires设置为一个过去值, 一般会设置为 Thu, 01-Jan-1970 00:00:01 GMT 因为这是时间零点, 设这个总不会错. document.c ...
- C#学习基础资料记录---字典(Dictionary),时间表示方法(DateTime.Now),文件操作
1.字典 https://www.cnblogs.com/gengaixue/p/4002244.html 2.时间的表示方法 DateTime.Now的多种用法 https://www.cnblog ...
- 维护solr索引库
一 2)solrcore 一个solr下可以有多个solrcore,每个solrcore就是一个独立的索引库3)solrconfig.xml lib:配置solr的扩展包的位置,不指定路径 ...
- 【ES6 】ES6 字符串扩展及新增方法
模板字符串 传统写法 var str = 'There are <b>' + basket.count + '</b> ' + 'items in your basket, ' ...
- [转载]torch参数:torch.backends.cudnn.benchmark的意义
[转载]torch参数:torch.backends.cudnn.benchmark的意义 来源:https://zhuanlan.zhihu.com/p/73711222 完整版请看原文,这里只截取 ...
- 用最简单的代码写出banner图轮播效果
以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html
- 一个比ES处理数据更快的工具--Hubble.Net
http://www.cnblogs.com/eaglet/tag/Hubble.Net/
- 【Git】四、本地Git的工作原理
一.工作区 第一篇创建版本库讲的有些笼统,这里详细区分一下各个概念 在第一篇我们创建了一个文件夹GitRepo,但其实这个文件夹本身并不是版本库,只是我们的工作区.我们所有的文件创建和修改都在这里执行 ...
- 我理解的epoll(二)——ET、LT的实例分析
https://www.cnblogs.com/yuuyuu/p/5103744.html 这篇文章已经写的很清楚了,暂时不展开论述了. http://blog.csdn.net/weiyuefei/ ...
- mybatis-generator-gui
mybatis-generator-gui介绍 mybatis-generator-gui是基于mybatis generator开发一款界面工具, 本工具可以使你非常容易及快速生成Mybatis的J ...