题解:P9278 [AGM 2023 资格赛] 另一个游戏
· 阅读需 2 分钟
原题链接
解题思路
- 这是一道博弈论题,可以用倒推求解:
-
在只剩 堆时获得先手,就能把第 堆全部移完,把第 堆留给对手,即可赢得比赛。
-
为了在只剩 堆时获得先手,要在只剩 堆的时候获得先手,并移走第 堆中的 个,使对手只能移走最后 个。
-
不难发现,获得第 堆的先手,就可以获得 堆的先手。所以只要获得第 堆的先手即可获胜。
-
因为题目是将第 堆移到第 堆,且每一堆都是正整数,所以从第 堆开始,后面不会出现只有 个石子的情况。
-
Charlie
开局是先手,只要第 堆不只 个,都可以移走 个,使Dan
只能移走最后 个。
-
综上所述:只要开局 ,
Charlie
都有必胜策略。特别地,当 时,只有两堆石子,Charlie 将第 堆全部移 完即可获胜。 -
最后整理得:当 或 时输出
Charlie
,否则输出Dan
。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int v[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
cout<<(v[1]!=1||n==2?"Charlie":"Dan")<<'\n';
return 0;
}