题目

给定 n 堆石子,两位玩家轮流操作,每次操作可以取走其中的一堆石子,然后放入两堆规模更小
的石子(新堆规模可以为 0,且两个新堆的石子总数可以大于取走的那堆石子数),最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,其中第 i 个整数表示第 i 堆石子的数量 ai。

输出格式

如果先手方必胜,则输出 Yes。

否则,输出 No。

数据范围

1≤n,ai≤100

输入样例:
2 2 3
输出样例:
Yes
思路

对比于集合nim游戏,其他步骤都一样,只不过此时局面的变化用一个循环来遍历(分成两堆规模更小的石子),并且求其sg值
for(int i = 0; i < x; i ++) for(int j = 0; j <= i; j ++) S.insert(sg(i) ^
sg(j));
代码
#include<iostream> #include<cstring> #include<unordered_set> using namespace
std; const int N = 110; int f[N]; int sg(int x) { if(f[x] != -1) return f[x];
unordered_set<int> S; for(int i = 0; i < x; i ++) for(int j = 0; j <= i; j ++)
S.insert(sg(i) ^ sg(j)); //mex操作 for(int i = 0; ; i ++) if(!S.count(i)) return
f[x] = i; } int main() { int n; cin >> n; memset(f, -1, sizeof f); int res = 0;
for(int i = 0; i < n; i ++) { int x; cin >> x; res ^= sg(x); }
if(res)puts("Yes"); else puts("No"); return 0; }

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信