最近刚学了博弈论,拿来练练手qwq
其实和数值的大小并没有关系
我们用N/P态来表示必胜/必败状态
先在草稿纸上探究硬币♦在最左侧(其实左右侧是等价的)的一条长链的N/P态,设链长为n
我们用1代替其他所有非0数
n=2: ♦1 N态
n=3: ♦11 P态
......
我们发现,当n为奇数时,则为P态,反之为N态。
于是我们就找到了硬币在最左侧时的答案。
但是,实际上硬币并不一定在最左侧
此时我们只需要分别判断硬币左边的链和硬币右边的链,只要有一种为N态,则Alice赢,反之Bob赢(双方都会选择最优走法)。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[],n,l=,r=; //记得要算上硬币所在的点
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&a[i]),a[n+i]=a[i];
for(int i=n;a[i];--i) ++l; //左侧判断
for(int i=n+;a[i];++i) ++r; //右侧判断
if((l&)&&(r&)) printf("NO"); //任何一个为奇数则Alice赢
else printf("YES");
return ;
}