Acwing_892(台阶-Nim游戏)

原题链接:

892. 台阶-Nim游戏 - AcWing题库

题解:

本题是在Nim游戏基础上的一个进阶版本。

代码:

#include<bits/stdc++.h>
using namespace std;
int n, res = 0, m = 1;

int main() {
	cin >> n;
	while (n--) {
		int x; cin >> x;
		if (m % 2) res ^= x;
		m++;
	}
	if (res) cout << "Yes" << endl;
	else cout << "No" << endl;
}

疑惑点:

为什么不能只考虑偶数台阶, 让偶数台阶也变成NIM游戏呢? 

首先需要明确Nim游戏中,每个玩家的操作都要使得当前状态发生改变。因此:

  1. 偶数台阶如果不包括0层,那么移动第一层的石子不符合Nim游戏,因为偶数台阶(2,4,6…)无变化。
  2. 偶数台阶如果包含0层,那么0层的石子是无法减少的,同样不符合Nim游戏。
  3. 只有奇数层可以符合Nim游戏的规则

首先模拟一下奇数台阶:
首先我们看异或不为零带来的是什么信息?---->就是在奇数台阶上肯定有石子可以拿(因为异或为零那么有可能是奇数台阶上的石子数量全为零,也有可能有石子但异或也为零(比如1 2 3)),但是异或不为零是肯定有石子的。所以只要一开始奇数台阶上是异或不为零,经过总的证明可以知道,我们肯定可以通过拿某奇数台阶上的石子是他们的异或为零。模拟一下:假如对手,不动奇数台阶上的石子,他将动偶数台阶上的石子,那么我们只需要跟着他操作,继续维持奇数台阶上的异或为零,所以说偶数台阶是不需要考虑的(因为离地面最近的台阶是1号台阶,奇数)。
模拟偶数台阶为nim:
假如我们以偶数台阶为nim的话,和奇数一样,我们维持偶数台阶上始终有石子可以给我们拿(就是当我们操作时他们异或不为零),当我们操作到最后,对手面临偶数台阶上没有一个石子,他一定不能再做吗?不然,首先模拟一下:我们最后一步操作时,假设所有偶数台阶上只有在2号台阶上剩一个,我们将他移到1号台阶上,此时留给对手的确实是偶数台阶上的异或为零,但是他还可以操作,就是将一号台阶上的石子移到地面,那么此时我们就输了。至于设奇数台阶为nim,就是因为一号台阶是奇数,且离地面最近,这样我们保证奇数台阶异或不为零,就是至少保证者一号台阶上有石子,那么我们就能掌握胜利

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值