bzoj 3895: 取石子(博弈)
3895: 取石子
Time Limit: 1 Sec Memory Limit: 512 MB
Submit: 318 Solved: 159
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
哈哈: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: 取石子(博弈)相关推荐
- sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)
小志志和小峰峰的日常 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小志志和小峰峰特别喜欢一起讨论一些很好玩的问题. ...
- bzoj3895: 取石子(博弈论,记忆化搜索)
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MB Submit: 361 Solved: 177 [Submit][Status][Discuss] ...
- 【NYOJ】取石子系列总结(十一题全)
取石子(一) 基础的巴什博奕 巴什博奕的重点是只有一堆, 如果n % (m + 1) != 0 则先手赢,如果用普通的数组会TLE. 证明:如果n = m + 1,先手最多拿m个,肯定有剩下的,所以先 ...
- BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp
title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...
- bzoj 1413: [ZJOI2009]取石子游戏(博弈+DP)
1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 711 Solved: 470 [Submit][Sta ...
- 洛谷P2252 取石子游戏(威佐夫博弈)
题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- 梦工厂实验室 取石子之fans 博弈
问题 D: 取石子之fans 时间限制: 1 Sec 内存限制: 64 MB 提交: 57 解决: 26 [提交][状态][讨论版] 题目描述 Yougth和Hrdv玩一个游戏,拿出n个石子摆成一 ...
- 威佐夫博弈:百练OJ:1067:取石子游戏
威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...
- HDU 2516 取石子游戏 斐波纳契博弈
斐波纳契博弈: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍) ...
最新文章
- 《ActionScript 3.0基础教程》——第2章 往舞台动态地添加对象2.1 创建库资源,并为它命名...
- 学知识的时候出去看看的意义
- ftp服务器文件查找功能,ftp服务器端查找功能
- arcgis python实例_arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
- Android选项切换条SHSegmentControl
- Microsoft.Net框架程序设计学习笔记(15):事件之原理分析
- 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法
- 信息学奥赛一本通C++语言——1100:金币
- 使用Spring Security进行自动登录验证
- ACM - ICPC World Finals 2013 A Self-Assembly
- IOS控件圆角、描边
- CefSharp入门-winform
- win10c盘扩容_系统C盘满了空间不足的扩容?
- 美国西北大学计算机硕士offer,已经被心仪的美国院校放入Waitlist!还有多大的转正几率?...
- 在c语言中括号里面有两个算式,聪明题有答案
- subplots用法详解
- oracle12c cdb修改,Oracle 12C CDB字符集修改
- UKF-MATLAB实现
- C语言中宏定义和函数的区别
- 内网渗透中的域管与域控快速定位
热门文章
- 自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?
- 用python画皮卡丘-利用Python绘制萌萌哒的皮卡丘
- python的第三方库是干什么用的-python标准库和第三方库的区别
- 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
- 小米的语音识别系统是如何搭建的
- 嵌套组合图echarts
- 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
- 小试ImageMagik——使用篇
- filazilla搭建ftp_使用Filezilla搭建FTP服务器
- INS-13001环境不满足最低要求