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的圈,这种圈就是起到一次交换先后手的作用, ...
随机推荐
- Javascript 表达式中连续的 && 和 || 之赋值区别
为了区分赋值表达式中出现的连续的 ‘&&’和 ‘||’的不同的赋值含义,做了一个小测试,代码如下: function write(msg){ for(var i = 0; i ...
- Tomcat源码解析-启动过程分析之主干流程
Tomcat启动入口就在脚本startup.sh中,具体脚本可以看tomcat的源码,这个启动脚本主要用来判断环境,找到catalina.sh脚本路径,将启动参数传递给catalina.sh执行.ca ...
- 华为OD两轮技术面试
华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...
- mysql 索引和视图
第五节:创建索引5.1 创建表的时候创建索引 CREATE TABLE 表名(属性名数据类型[完整性约束条件], 属性名数据类型[完整性约束条件], .... 属性名数据类型 [UNIQUE | FU ...
- python3之urllib基础
urllib简单应用html=urllib.request.urlopen(域名/网址).read().decode('utf-8')----->--->urlopen-->获取源码 ...
- JQueryUI Chosen插件
github地址:https://harvesthq.github.io/chosen/#change-update-events Using Chosen is easy as can be. Do ...
- 应对百万访问量的epoll模式
写在前面 select/poll与epoll select/poll模型工作机理 select/poll模型的局限 epoll模型工作机理 epoll的局限 golang中的epoll golang源 ...
- 吴裕雄--天生自然 python数据分析:基于Keras使用CNN神经网络处理手写数据集
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mp ...
- 为啥Waymo和Uber间的官司,这么难界定?
自动驾驶作为被众多巨头和创业者看好的技术及领域,已有众多企业涉足其中.在自动驾驶尚未完全落地.制定统一标准前,每家企业都在争分夺秒地进行研发,试图率先抢占自动驾驶的高地.毕竟一旦成功,就能够创造巨大的 ...
- VMware虚拟机里安装CentOS 6.3图文教程
著名服务器版本 CentOS 6.3 已经发布 http://www.centoscn.com/CentosSoft/iso/2013/0720/370.html CentOS 6.3 网易镜像下载: ...