3895: 取石子

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 318  Solved: 159
[Submit][Status][Discuss]

Description

Alice和Bob两个好朋含友又开始玩取石子了。游戏开始时,有N堆石子
排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:
·从某堆石子中取走一个
·合并任意两堆石子
不能操作的人输。Alice想知道,她是否能有必胜策略。

Input

第一行输入T,表示数据组数。
对于每组测试数据,第一行读入N。
接下来N个正整数a1,a2…an,表示每堆石子的数量。

Output

对于每组测试数据,输出一行。
输出YES表示Alice有必胜策略,输出NO表示Alice没有必胜策略。

Sample Input

3
3
1 1 2
2
3 4
3
2 3 5

Sample Output

YES
NO
NO

哈哈:O(1)的算法第一

总体模型:

设有n堆石子,sum为所有石子个数,那么最大操作数sg = sum+n-1

很显然最后面对sg=0的那个人失败,当前有三种操作:

①合并两堆石子:sg = sg-1

②从某一堆取走1个石子,取完之后那堆石子还有剩余:sg = sg-1

③某一堆石子只剩下一个,取走:sg = sg-2

考虑特殊情况:

如果不存在只有1个石子的石子堆,且sg为奇数,那么先手的Alice一定可以避免让Bob有机会执行上面的第③种操作

也就是如果某堆石子个数为2个,那么Alice绝对不会去取这一堆

这样每到Bob时sg就为偶数,显然Alice必胜,同理初始sg为偶数Alice必败

实际情况:

可能存在只有1个石子的石子堆

假设只有1个石子的石子堆有且只有1堆,那么Alice有两种操作:①将这堆石子和其它堆合并;②取走这个石子

可以发现无论Alice选操作①还是②都会使局面变为上面那种特殊情况,但是!两个操作的sg的奇偶结果不同

也就是先手的Alice可以控制局面从而必胜

我们再假设只有1个石子的石子堆有且只有2堆,那么Alice为了防止必败,一定要将这两堆石子合并成一个有两个石子的石子堆,这个时候仍然是上面的特殊情况,根据特殊情况判断胜负即可

……

以此类推,可以得出结论:

如果只有1个石子的石子堆为奇数堆,那么Alice必胜,否则就直接按上面的特殊情况进行处理

但是到这里还有一种情况没有判断:

全是只有一个石子的石子堆(即{1,1,…,1}):

对于{1}Alice必胜就不说了,对于{1,1}Alice只要将两堆石子合并成{2},Alice仍然必胜

{1,1,1}时Alice只能合并其中两堆,这样局面会变为{2,1},Bob只要把那个"1"拿走就必胜,所以Alice必败

……

以此类推,如果堆数不是3的倍数,那么Alice必胜,否则Alice必败

当然还有当前情况生成局面{2,1,1,…,1},就看只有1个石子的石子堆数是不是3的倍数,判别方法和上面一样

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[55];
int main(void)
{int T, n, i, b, c;scanf("%d", &T);while(T--){b = 0, c = -1;scanf("%d", &n);for(i=1;i<=n;i++){scanf("%d", &a[i]);if(a[i]==1)  b++;else  c += a[i]+1;}if(c==-1 || b==n-1 && c==2){if(b%3==0)  printf("NO\n");else  printf("YES\n");}else{if(c%2 || c%2==0 && b%2)  printf("YES\n");else  printf("NO\n");}}return 0;
}

bzoj 3895: 取石子(博弈)相关推荐

  1. sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)

    小志志和小峰峰的日常 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小志志和小峰峰特别喜欢一起讨论一些很好玩的问题.  ...

  2. bzoj3895: 取石子(博弈论,记忆化搜索)

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MB Submit: 361  Solved: 177 [Submit][Status][Discuss] ...

  3. 【NYOJ】取石子系列总结(十一题全)

    取石子(一) 基础的巴什博奕 巴什博奕的重点是只有一堆, 如果n % (m + 1) != 0 则先手赢,如果用普通的数组会TLE. 证明:如果n = m + 1,先手最多拿m个,肯定有剩下的,所以先 ...

  4. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp

    title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...

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

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

  6. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  7. 梦工厂实验室 取石子之fans 博弈

    问题 D: 取石子之fans 时间限制: 1 Sec  内存限制: 64 MB 提交: 57  解决: 26 [提交][状态][讨论版] 题目描述 Yougth和Hrdv玩一个游戏,拿出n个石子摆成一 ...

  8. 威佐夫博弈:百练OJ:1067:取石子游戏

    威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...

  9. HDU 2516 取石子游戏 斐波纳契博弈

    斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...

最新文章

  1. 《ActionScript 3.0基础教程》——第2章 往舞台动态地添加对象2.1 创建库资源,并为它命名...
  2. 学知识的时候出去看看的意义
  3. ftp服务器文件查找功能,ftp服务器端查找功能
  4. arcgis python实例_arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
  5. Android选项切换条SHSegmentControl
  6. Microsoft.Net框架程序设计学习笔记(15):事件之原理分析
  7. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
  8. 信息学奥赛一本通C++语言——1100:金币
  9. 使用Spring Security进行自动登录验证
  10. ACM - ICPC World Finals 2013 A Self-Assembly
  11. IOS控件圆角、描边
  12. CefSharp入门-winform
  13. win10c盘扩容_系统C盘满了空间不足的扩容?
  14. 美国西北大学计算机硕士offer,已经被心仪的美国院校放入Waitlist!还有多大的转正几率?...
  15. 在c语言中括号里面有两个算式,聪明题有答案
  16. subplots用法详解
  17. oracle12c cdb修改,Oracle 12C CDB字符集修改
  18. UKF-MATLAB实现
  19. C语言中宏定义和函数的区别
  20. 内网渗透中的域管与域控快速定位

热门文章

  1. 自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?
  2. 用python画皮卡丘-利用Python绘制萌萌哒的皮卡丘
  3. python的第三方库是干什么用的-python标准库和第三方库的区别
  4. 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
  5. 小米的语音识别系统是如何搭建的
  6. 嵌套组合图echarts
  7. 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
  8. 小试ImageMagik——使用篇
  9. filazilla搭建ftp_使用Filezilla搭建FTP服务器
  10. INS-13001环境不满足最低要求