78.Acwing基础课第892题-简单-台阶-Nim游戏
78.Acwing基础课第892题-简单-台阶-Nim游戏
题目描述
\(现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 a_i 个石子(i≥1)\)。
\(两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)\)。
\(已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败\)。
\(问如果两人都采用最优策略,先手是否必胜\)。
输入格式
\(第一行包含整数 n\)。
\(第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 a_i\)。
输出格式
如果先手方必胜,则输出 Yes。
否则,输出 No。
数据范围
\(1≤n≤10^5\),
\(1≤a_i≤10^9\)
输入样例:
3
2 1 3
输出样例:
Yes
代码:
// 包含基础输入输出、算法头文件
#include <iostream>
#include <algorithm>
using namespace std;
// 常量定义:N=100010,适配输入数据的最大规模(支持n≤1e5)
const int N = 100010;
int main()
{
int n; // n:游戏中堆的总数(堆按1~n顺序编号)
scanf("%d", &n); // 输入堆的数量
int res = 0; // 存储奇数位置堆的异或结果(核心判断值)
// 遍历每一堆(i为堆的编号,从1开始)
for (int i = 1; i <= n; i ++ )
{
int x; // x:当前堆的石子数量
scanf("%d", &x); // 输入当前堆的石子数
// i & 1:判断堆的编号是否为奇数(等价于i%2==1)
// 仅对奇数位置的堆做异或累积(偶数位置堆不参与判断)
if (i & 1) res ^= x;
}
// 胜负判断规则(同尼姆游戏,但仅基于奇数堆的异或和):
// res≠0 → 先手有必胜策略(输出Yes)
// res=0 → 先手必败(输出No)
if (res) puts("Yes");
else puts("No");
return 0;
}

浙公网安备 33010602011771号