取(m堆)石子游戏

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4610 Accepted Submission(s): 2775

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博弈
对于先手必败的情况,直接输出No就行了
对于先手必胜,我们需要让先手第一次取走后剩下的石子保证奇异局势为0(即后手拿的时候必败)的状态。
输出的时候,让原本的奇异局势与当前堆的石子数异或,如果异或结果小于等于当前石子数,输出即可

AC代码

/*
* @Author: WZY
* @School: HPU
* @Date:   2019-01-03 16:54:58
* @Last Modified by:   WZY
* @Last Modified time: 2019-01-03 17:21:29
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <time.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define pi acos(-1.0)
#define INF 0x7f7f7f7f
#define lson o<<1
#define rson o<<1|1
#define bug cout<<"---------"<<endl
#define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"\n"
const double E=exp(1);
const int maxn=1e6+10;
const int mod=1e9+7;
using namespace std;
int a[maxn];
int main(int argc, char const *argv[])
{ios::sync_with_stdio(false);#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);double _begin_time = clock();#endifint n;while(cin>>n&&n){int ans=0;for(int i=0;i<n;i++){cin>>a[i];ans^=a[i];}if(!ans)cout<<"No"<<endl;else{cout<<"Yes"<<endl;for(int i=0;i<n;i++){if((ans^a[i])<=a[i])cout<<a[i]<<" "<<(ans^a[i])<<endl;}}}#ifndef ONLINE_JUDGEdouble _end_time = clock();printf("time = %lf ms.", _end_time - _begin_time);#endifreturn 0;
}

转载于:https://www.cnblogs.com/Friends-A/p/10324311.html

HDU 2176:取(m堆)石子游戏(Nim博弈)相关推荐

  1. 杭电 2176 取(m堆)石子游戏(博弈)

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. HDU - 2176 取(m堆)石子游戏(尼姆博奕)

    题目链接:点击查看 题目大意:给出m堆石子,规则是尼姆博弈的规则,问先手必胜还是必败,若能必胜则第一次有多少种方式取石子 题目分析:这个题目是因为一开始知道尼姆博弈的结论,需要异或所有石子来判断的,然 ...

  3. HDU2176 取(m堆)石子游戏【Nim博弈】

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. ACM-尼姆博弈之取(m堆)石子游戏——hdu2176

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. HDUOJ-----2175取(m堆)石子游戏

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU2516 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)

    1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 711  Solved: 470 [Submit][Sta ...

  8. 博弈论石子游戏——nim 游戏

    P2197 [模板]nim 游戏(转自洛谷) 题目描述 甲,乙两个人玩 nim 取石子游戏. nim 游戏的规则是这样的:地上有 n 堆石子(每堆石子数量小于 10^4),每人每次可从任意一堆石子里取 ...

  9. 取两堆石子(威佐夫博弈)

    有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者 ...

  10. POJ1067 HDU1527 取石子游戏【博弈】

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

最新文章

  1. SAP SD基础知识之与FI集成相关的流程与配置
  2. HDLBits 系列(1)从HDLBits中获取灵感,整顿自己,稳步前行
  3. python爬虫从入门到放弃(三)之 Urllib库的基本使用
  4. common.php中路径,关于ThinkPHP中Common/common.php文件常用函数的功能分析
  5. ps cs6磨皮插件_【PS插件】ps磨皮插件Portraiture
  6. linux aemv7,无法在我的Ubuntu machin中安装“xlwings”
  7. NB-IoTDTU对比于3G/4G DTU的区别和优势
  8. c语言万能预编译,Objective-C学习笔记
  9. 使用docker 起容器配置负载均衡(加权)
  10. python读取svg转emf_ppt矢量图标,SVG转换EMF方法
  11. QT 基于Libvlc的视频播放器
  12. 11210怎么等于24_算24点
  13. [工作记事] Ubuntu 编译安装PHP以及gd库使得支持jepg
  14. 考研经验贴(南京航空航天大学,电子信息专硕)
  15. win10 安装 ad9
  16. 磁盘分区、格式化及 LVM 管理
  17. SSH简介及登录方法
  18. Moleskine笔记本使用之感受【个人管理篇】
  19. AtomicBoolean意义何在
  20. 计算机word2003操作试题,职称计算机word2003操作试题

热门文章

  1. 设计了一个JavaScript的源代码混淆器
  2. Android中启动页ViewPager和ViewFlipper带指示器
  3. C# 比较两个数组中的内容是否相同的算法
  4. 2.Entity Framework Core 5.0 创建数据库(code frist)和迁移
  5. 闹钟流程_自考专升本1月份统考粤康码申报流程
  6. 7zip压缩zip格式时文件名支持中文的设置
  7. Package sqlite3 was not found in the pkg-config search path.add the directory containing `sqlite3.pc
  8. LINUX下载编译g729
  9. linux rpm安装简要说明
  10. 晶体管制程极限之后,多层CPU是否可能?