世界真的很大
博弈论的题还是很多了,其中SG函数的存在使得很多看似无解可循的博弈论有了固定的解法
但是有很多博弈论的题的SG函数是不好分析的,就算打表找规律也无处下手
这样的题数据范围往往很大,这就几乎决定了其主要有题目性质决定
凡是博弈论的组合游戏的题,不要忘了其老祖宗nim游戏,要去思考与原版游戏的关系
看题先:
description:
考虑给普通的nim游戏加上一条规则
如果前一个人摸一堆,没有摸完的话,就必须和他摸同一堆石子
input
第一行一个整数T表示T组数据
每组数据第一行一个整数n,表示n堆石子
接下来n个整数,表示每一堆有多少石子
output
输出一个字符串表示先手胜还是后手胜
首先分析一下题意
题目几乎是建立在nim游戏的基础上的,而且SG函数实在是不太好推,所以我们要从题目性质来分析,而且要考虑其与原nim游戏的关系
假设只有第一堆需要遵守这道题新定的规则,其余的所有堆都不需要遵守这道题的规则
那么把第一堆取完之后,其余石子的胜负状态就已经唯一决定了
假设其余石子的异或和是0,就是说先手必败的话,那么现在的先手肯定希望面临那个状态的是对方而不是自己,于是他就会直接把第一堆石子拿完,这样就是对面面临异或和为0的状态了
考虑其余石子异或和不为0,即先手必胜,那么现在的先手就希望是自己而不是对方来面临这个局面,于是乎他就会一下把这堆石子拿到只剩一颗,由于规则限制,对方只能摸那剩下的一颗,这样就是自己来面临必胜的局面了
这样看来先手有必胜策略,但是我们只是考虑了受规则限制的石子堆数为1的情况,现在需要把情况扩充到更完全的情况中去
考虑有很多堆需要遵守规则约束的石子,先手完全可以控制后手摸完一堆堆的石子只留下一对需要受限制的石子,就成了情况一
现在考虑当石子数为多少的时候,受限制等价于不受限制,只有当石子数为1的时候
那么我们就将石子数为1的和石子数不为1的堆分开考虑,前者指代之前讨论的情况中的不受限制的石子,后者指代前面讨论的情况中的受限制的石子堆
注意他们是完全等价的,也就是说先手有必胜策略,当且仅当有受限制的石子堆存在可供先手操控
也就是说只要有受限制的,即石子数不为1的石子堆存在,就是先手必胜了
那么需要处理的只有全部石子堆都为1的情况
显然和普通nim游戏一样,判断一下异或和,全是1就是奇偶数,就行了,偶数就是先手必败,奇数就是先手必胜
PS:感觉这游戏完全不公平嘛
完整代码:
#include<cstdio>
using namespace std;
int T,n,a;
int main()
{
scanf("%d",&T);
while(T--)
{
int ok=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(a!=1) ok=0;
}
if(ok && n%2==0)
printf("piloop\n");
else printf("poopi\n");
}
return 0;
}
/*
Whoso pulleth out this sword from this stone and anvil is duly born King of all England
*/
嗯,就是这样