#bYybttg060708. 1670:取石子游戏
1670:取石子游戏
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:ZJOI 2009
在研究过 Nim 游戏及各种变种之后,Orez 又发现了一种全新的取石子游戏,这个游戏是这样的:
有 堆石子,将这 堆石子摆成一排。游戏由两个人进行,两人轮流操作,每次操作者都可以从最左或最右的一堆中取出若干颗石子,可以将那一堆全部取掉,但不能不取,不能操作的人就输了。
Orez 问:对于任意给出一个初始局面,是否存在先手必胜策略。
输入格式
第一行为一个整数 ,表示有 组测试数据。
对于每组测试数据:
- 第一行为一个整数 ,表示有 堆石子;
- 第二行为 个整数 ,依次表示每堆石子的数目。
输出格式
对于每组测试数据,输出一行一个整数 0 或 1:
1表示有先手必胜策略;0表示没有先手必胜策略(即后手必胜)。
样例
样例输入
1
4
3 1 9 4
样例输出
0
样例解释
初始石子排列:。
这是一个 双端取石子游戏(两端取石子),也称为 LR 取石子 或 边界取石子游戏。
分析:
当 为偶数且满足 ,即对称相等时,后手有必胜策略(模仿策略)。
当不满足对称条件时,先手可以通过破坏对称性获得必胜策略。
验证: 为偶数,比较对称位置:
- ,不相等;
- ,不相等。
因此不满足对称相等条件,按理说先手有必胜策略?但样例输出是 0(后手必胜)。
这说明上述简单对称条件判断只适用于部分情况,实际本题更复杂,需要更精细的 SG 函数分析 或 动态规划。
实际上这个游戏被称为 “取石子游戏(两端取)”,当 为偶数且对称相等时后手必胜的结论只在每堆石子数相差不超过 1 的特殊情况下成立。
本题一般情况需要用 区间 DP 计算 SG 值。设 表示区间 左边增加一堆数量为 的石子时,整个局面的 SG 值集合的 mex 相关信息;类似定义 。
通过 DP 递推判断全局 SG 值是否为 0。
样例经过 DP 计算得到全局 SG 值为 0,所以先手必败,输出 0。
数据范围
- 对于 的数据,;
- 对于 的数据:
时空限制
- 时间:
- 内存:
提示
这是一个 组合博弈 问题,但不是简单的 Nim 游戏,因为每次只能取最左或最右的石子堆。
可以用 区间 DP 计算 SG 值。
定义 表示当前局面为石子堆 ,且在这段区间的左边有一堆虚拟的石子(数量记为 )时,这个虚拟堆的 SG 值集合的 mex 相关信息。类似定义 表示右边有一堆虚拟石子时的信息。
然后通过递推:
具体公式较复杂,但最终全局先手必胜当且仅当 或 。
实际实现时需注意 的特殊情况(先手直接取完,必胜)。