此时我们需要将奇数台阶看做一个经典的Nim游戏,如果先手时奇数台阶上的值的异或值为0,则先手必败,反之必胜
- 证明:
先手时,如果奇数台阶异或非0,根据经典Nim游戏,先手总有一种方式使奇数台阶异或为0,于是先手留了奇数台阶异或为0的状态给后手
于是轮到后手:
①当后手移动偶数台阶上的石子时,先手只需将对手移动的石子继续移到下一个台阶,这样奇数台阶的石子相当于没变,于是留给后手的又是奇数台阶异或为0的状态
②当后手移动奇数台阶上的石子时,留给先手的奇数台阶异或非0,根据经典Nim游戏,先手总能找出一种方案使奇数台阶异或为0
因此无论后手如何移动,先手总能通过操作把奇数异或为0的情况留给后手,当奇数台阶全为0时,只留下偶数台阶上有石子。
(核心就是:先手总是把奇数台阶异或为0的状态留给对面,即总是将必败态交给对面)
因为偶数台阶上的石子要想移动到地面,必然需要经过偶数次移动,又因为奇数台阶全0的情况是留给后手的,因此先手总是可以将石子移动到地面,当将最后一个(堆)石子移动到地面时,后手无法操作,即后手失败。
因此如果先手时奇数台阶上的值的异或值为非0,则先手必胜,反之必败!
C++ 代码
#include <iostream>
using namespace std;
int main()
{
int res = 0;
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
int x;
cin >> x;
if(i % 2) res ^= x;
}
if(res) puts("Yes");
else puts("No");
return 0;
}
因为偶数台阶上的石子要想移动到地面,必然需要经过偶数次移动,又因为奇数台阶全0的情况是留给后手的(即后手最后会面临:一级台阶0个,二级台阶1个的局面,此时只能将二级台阶的一个移动到一级台阶上,之后先手将一级台阶的石子移动到地面之后赢得游戏),因此先手总是可以将石子移动到地面,当将最后一个(堆)石子移动到地面时,后手无法操作,即后手失败。
为什么不能只考虑偶数台阶, 让偶数台阶也变成NIM游戏呢?不太懂😥😥
因为最后要把石子都放到地面,地面是第0层(偶数层)
大概懂了,orz
感觉这么理解也是可以的
对手移动偶数级台阶的若干石子放到下一级,我们总能把这些石子再放到下一级 偶数台阶上,而0级台阶没有下一级
是这样嘛
nb
2.首先模拟一下奇数台阶:
首先我们看异或不为零带来的是什么信息?---->就是在奇数台阶上肯定有石子可以拿(因为异或为零那么有可能是奇数台阶上的石子数量全为零,也有可能有石子但异或也为零(比如1 2 3)),但是异或不为零是肯定有石子的。所以只要一开始奇数台阶上是异或不为零,经过总的证明可以知道,我们肯定可以通过拿某奇数台阶上的石子是他们的异或为零。模拟一下:假如对手,不动奇数台阶上的石子,他将动偶数台阶上的石子,那么我们只需要跟着他操作,继续维持奇数台阶上的异或为零,所以说偶数台阶是不需要考虑的(因为离地面最近的台阶是1号台阶,奇数)。
2.模拟偶数台阶为nim:
假如我们以偶数台阶为nim的话,和奇数一样,我们维持偶数台阶上始终有石子可以给我们拿(就是当我们操作时他们异或不为零),当我们操作到最后,对手面临偶数台阶上没有一个石子,他一定不能再做吗?不然,首先模拟一下:我们最后一步操作时,假设所有偶数台阶上只有在2号台阶上剩一个,我们将他移到1号台阶上,此时留给对手的确实是偶数台阶上的异或为零,但是他还可以操作,就是将一号台阶上的石子移到地面,那么此时我们就输了。至于设奇数台阶为nim,就是因为一号台阶是奇数,且里地面最近,这样我们保证奇数台阶异或不为零,就是至少保证者一号台阶上有石子,那么我们就能掌握胜利
牛逼
脑洞真的太大了,看完直接卧槽
大哥好,写得好详细,爱了爱了💎 💎
这种如果是第一次做的话怎么才能想到这个解法呢
基础课就不要想着自己想出方法,基础课就是基础知识。
就好比你学三角形的边长问题,问怎么才能想出勾股定理这种方法。
我可能没表述清楚 就是nim游戏这个模型已经理解的情况下 第一次接触选奇数台阶这种trick性很强的题该怎么办?
一般Nim游戏的题目还是比较容易看出来的hh,就看你思维,先去猜,然后证明自己的猜想正确hh
感谢大佬 %%%
这就是考查智力的地方,也是各种竞赛的区分度所在了😭
好难啊 。。。。
可以将本题看成多步取石子,只有奇数位可以胜,所以偶数位就没有用了,qwq
%%%%%%
强!
%%%%%%%%%%%%%
谢谢~
写的真好,醍醐灌顶,而且我觉得核心那里提炼的是真的好。
谢谢~
先手已经是0,后手无论如何操作都是0
先手已经是0,后手无论如何操作都是非0
笔记记错了
ATA
代码错的
建议你crtrl cv
ctrl
评论错了 是另一个题解代码错了
写的好啊,简单易懂,妙!!!
谢谢😁