Day1T1仓鼠的石子游戏——博弈论
打比赛的时候还没学博弈论,打完下来花了半个多小时学完,发现这题就是一道\(SG\)函数
其实当时差一点就\(YY\)出了答案,但是后面太难想,所以没整出来
机房大佬们都说自己没学博弈论,但是都AC
题解
假设先手兔子(我)放的是黑棋,仓鼠(小埋)放的是白棋
首先这道题的\(n\)个环可以认为是\(n\)个独立的\(G_1,G_2,G_3...\)有向图游戏,共同构成\(G\)游戏
那么$SG(G) = SG(G_1) $ \(XOR\) \(SG(G_2)\) \(XOR\) \(SG(G_3)......\)
所以我们只需要构造每个环的\(SG\)函数即可(本题其实不需要构造
咋构造啊
手玩一下样例,发现当\(a[i] = 1\)时有先手必胜态
其他的咋搞呢
好多人手玩样例赌了一下有先手必败态,然后还真的\(A\)了,就连题解都是这么写的……
然而正直的我没……
咳咳,首先有必败态当且仅当所有的空位置都在黑棋旁边。
那么我们就可以列出所有的必败态
首先空位置一定不能挨在一起,不然就可以填上某个颜色的棋
其次省略空位后黑棋白棋一定交替轮流出现,因为假如有两个相同颜色的棋相邻的话,其间必有一个空位,而这个空位可以填另一种颜色的棋
那么最后就可以说明最后黑棋白棋数量一定一样多
考虑奇偶性
当\(a[i]\)为奇数时,下一个轮到黑棋,黑棋如果要摆放,必须与另一个黑棋相邻,先手必败
当\(a[i]\)为偶数时,下一个轮到黑棋,黑棋没得走,先手必败
所以当$a[i] $不为\(1\)时,\(SG(G_i)\)均为\(0\)
为\(1\)时均为\(1\)
那么最后用\(SG\)函数\(XOR\)一下就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
#define rint register int
#define s1 "rabbit\n"
#define s2 "hamster\n"
int n, a[1010], T;
int main( void ){
scanf( "%d", &T );
while( T-- ){
memset( a, 0, sizeof( a ) );
scanf( "%d", &n );
for( rint i = 1; i <= n; i++ ){
int temp; scanf( "%d", &temp );
if( temp == 1 ) a[i] = 1;
else a[i] = 0;
}
for( rint i = 2; i <= n; i++ ) a[1] ^= a[i];
if( a[1] == 1 ) printf( s1 ); else printf( s2 );
}
return 0;
}
Day1T1仓鼠的石子游戏——博弈论的更多相关文章
- POJ.1067 取石子游戏 (博弈论 威佐夫博弈)
POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...
- HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...
- 【Foreign】石子游戏 [博弈论]
石子游戏 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output 输出T行,表示每组的答案. Sample Input 3 ...
- hdu 2516 取石子游戏 博弈论
很显然的nim游戏的变形,很好找规律 先手败:2,3,5,8,13…… 其他先手胜.即满足菲波拉数列. 代码如下: #include<iostream> #include<stdio ...
- 【GZOI2015】石子游戏 博弈论 SG函数
题目大意 有\(n\)堆石子,两个人可以轮流取石子.每次可以选择一堆石子,做出下列的其中一点操作: 1.移去整堆石子 2.设石子堆中有\(x\)个石子,取出\(y\)堆石子,其中\(1\leq y&l ...
- HDU.2516.取石子游戏(博弈论 Fibonacci Nim)
题目链接 \(Description\) 1堆石子有n个.两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍,取完者胜.问谁能赢. \(Solution ...
- 洛谷$P$2252 取石子游戏 博弈论
正解:博弈论 解题报告: 传送门! 威佐夫博弈板子昂$QwQ$ 关于这一类问题也有个结论,是说,先手必败的状态一定形如$(\left \lfloor i+\phi \right \rfloor,\le ...
- hdu 2177 取(2堆)石子游戏 博弈论
由于要输出方案,变得复杂了.数据不是很大,首先打表,所有whthoff 的奇异局势. 然后直接判断是否为必胜局面. 如果必胜,首先判断能否直接同时相减得到.这里不需要遍历或者二分查找.由于两者同时减去 ...
- 「牛客CSP-S2019赛前集训营1」仓鼠的石子游戏
传送门 NowCoder 解题思路 考虑这样一件事:在任何的同一个石圈,后手肯定会输. 证明很简单,手玩一下就可以大致意会. 但是有一种特殊情况,就是大小为1的圈,这种圈就是起到一次交换先后手的作用, ...
随机推荐
- @Value默认值填null
@Value("${topology.position.spout.maxpending:#{null}}") private Integer spoutMaxPending; @ ...
- SQL语句之查询(SELECT)
目录 SQL语句之查询(SELECT) 简单查询 限定查询 模糊查询 排序查询 多表查询 SQL语句之查询(SELECT) SQL是用于访问和处理数据库的标准计算机语言: 中文:结构化查询语言:英文全 ...
- python3之urllib基础
urllib简单应用html=urllib.request.urlopen(域名/网址).read().decode('utf-8')----->--->urlopen-->获取源码 ...
- 对H5新增多线程的理解与简单使用
由于JavaScript的特性决定了JavaScript语言是一种单线程语言,但是有时候我们需要使用多线程比如进行大量的计算时.H5为此新增了多线程的方法. 在这里我是用JavaScript来实现著名 ...
- .Java中的异常、断言、日志【草稿下,Log4j专题】
(本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...
- 18岁,赚到了人生中的第一个10W!
大家好,我是九歌 今年我18岁,赚到了我人生中的第一个10W 截至2019年10月14日,我已经做了43天的公众号啦,粉丝也悄然增长到了1W8,感谢各位读者朋友给我的支持和鼓励. 相信大部分读者都是从 ...
- JDK_Packages_java_utils
utils包需要关注的主要有 集合框架.并发包.函数式编程.观察者模式@see PropertyChangeSupport java.util(集合框架) Contains the collect ...
- 开始使用Github
Gather ye rosebuds while ye may 我自己也是刚开始使用github没几天,写得不好我就写自己常用的吧 2015年9月20日下午3:19更新知乎上这个答案写得好多了
- ConcurrentHashMap源码探究 (JDK 1.8)
很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理 ...
- 7-31 jmu-分段函数l (20 分)
本题目要求计算以下分段函数的值(x为从键盘输入的一个任意实数): 如果输入非数字,则输出“Input Error!” 输入格式: 在一行中输入一个实数x. 输出格式: 在一行中按”y=result”的 ...