[CodeVS1037] 取数游戏

描述 Description

有一个有趣得取数游戏。初始时,给出一个环,环上得每条边上都有一个非负整数。这些整数中至少有一个时 0。然后,将一枚硬币放在环上得一个节点上。二个玩家就是以这个放硬币得节点为起点开始这个游戏,二人轮流取数,取数得规则如下:

(1)选择硬币左边或右边得一条边,并且边上得数非 0;

(2)将这条边上的数减至任意一个非负整数(至少要有所减小);

(3)将硬币移到边的另一端。

如果轮到一个玩家走,这时硬币左右两边的边上的数值都是 0,那么这个玩家就输了。

如下图所示,描述的时爱丽思和鲍勃两人的对弈过程,其中黑色节点表示硬币所在节点,结果图(d)中,轮到鲍勃走时,硬币两边的边上都是 0。所以爱丽思获胜。

现在你的任务是根据给出的环、边上的数值以及起点(硬币所在位置),判断先走方是否有必胜的策略。

输入格式 InputFormat

第 1 行一个整数 N(N<=20),表示环上的节点数。

第 2 行 N 个数,数值不超过 30,依次表示 N 条边上的数值。硬币的起始位置是第一条边与最后一条边之间的节点上。

输出格式 OutputFormat

仅 1 行。若存在必胜策略,则输出‘YES’,否则输出‘NO’。

样例输入 SampleInput

4
2 5 3 0

样例输出 SampleOutput

YES


CodeVS 1037


代码 Code

可以得出从起点开始只要任一方向有连续奇数条非零边则先手有必胜策略。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int i,j,t,n,m,l,r,k,z,y,x;
inline void read(int &x)
{
    x=0;char ch=getchar();
    while (ch<'0' || ch>'9') ch=getchar();
    while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
}
int a[25];
int main()
{
    read(n);
    for (i=1;i<=n;i++) read(a[i]);
    for (x=0,i=1;a[i];i++) x++;
    for (y=0,i=n;a[i];i--) y++;
    if (x%2 || y%2) printf("YES\n");
    else printf("NO\n");
    return 0;
}