博客
关于我
hdu_oj2176取(m堆)石子游戏(nim博弈)
阅读量:297 次
发布时间:2019-03-01

本文共 909 字,大约阅读时间需要 3 分钟。

Problem Description

m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取时可以从有8个的那一堆取走7个剩下1个,也可以从有9个的中那一堆取走9个剩下0个,也可以从有10个的中那一堆取走7个剩下3个.

Input

输入有多组.每组第1行是m,m<=200000. 后面m个非零正整数.m=0退出.

Output

先取者负输出No.先取者胜输出Yes,然后输出先取者第1次取子的所有方法.如果从有a个石子的堆中取若干个后剩下b个后会胜就输出a b.参看Sample Output.

Sample Input

2 45 45 3 3 6 9 5 5 7 8 9 10 0

Sample Output

No Yes 9 5 Yes 8 1 9 0 10 3

这是一道nim博弈的模板题,想要证明实在是太麻烦了,其实只要记住结论和推论就可以做出来了,如果每堆石子的个数异或之后得到一个数k,如果k是0则先手必败,然后这道题目要求输出获胜策略,就需要记住一个推论,如果每堆石子的数量a异或这个k之后得到的石子数量p小于原先这堆石子的数量,即p<a,则获胜策略就是这一堆取出a-p个石子

下面附上ac代码

#include 
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;ll a[2000010];int main(){ std::ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); ll m; while(cin>>m&&m!=0) { ll k=0; for(ll i=1;i<=m;i++) { cin>>a[i]; k^=a[i]; } if(!k) cout<<"No"<

 

转载地址:http://kzlo.baihongyu.com/

你可能感兴趣的文章
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
mysql5.6.21重置数据库的root密码
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7性能调优my.ini
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>