欢迎光临
我们一直在努力

AcWing 891:Nim游戏 ← Nim博弈

【题目来源】 https://www.acwing.com/problem/content/893/ 【题目描述】 给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 【输入格式】 第一行包含整数 n。 第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量。​​​​​​​ 【输出格式】 如果先手方必胜,则输出 Yes。 否则,输出 No。 【输入样例】 2 2 3​​​​​​​ 【输出样例】 Yes​​​​​​​ 【数据范围】 1≤n≤10^5, 1≤每堆石子数≤10^9 【算法分析】 ● Nim 博弈定理:对于任意的 {a1, a2, a3, …, an},若 S=a1⊕a2⊕a3⊕⋯⊕an 的值不等于 0,先手必胜,记为 N-position(先手必胜态)。若 S=a1⊕a2⊕a3⊕⋯⊕an 的值等于 0,先手必败,记为 P-position(先手必败态)。 【算法代码】

#include <bits/stdc++.h>
using namespace std;

int main() {
int n,t=0;
cin>>n;
while(n–) {
int x;
cin>>x;
t^=x;
}
if(t==0) cout<<"No";
else cout<<"Yes";

return 0;
}

/*
in:
2
2 3

out:
Yes
*/

【参考文献】 https://www.acwing.com/file_system/file/content/whole/index/content/12084580/  

赞(0)
未经允许不得转载:171主机测评 » AcWing 891:Nim游戏 ← Nim博弈
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址