题目的意思是给你一个多边形,每条边上有一个权值,你开始在第一个点。每次你必须经过一条有权值的边,并且把该边的权值减小到任意一个非负值,到达该边的另外一个点。
谁第一个无法操作就算输。
题意很简单,解法也很简单。
这样考虑,题目说明了在给定的边中一定有一条边为0,也就是说给的是一条链,实际上不是环。
结论是这样的,先手的人可以有两个方向走,如果任意一个方向上有奇数条权值大于0的边,那么先手必胜,如果任意一个方向上的离0边的距离都为偶数或0,那么就是必输。
证明也很简单。
假设在任意一个方向上恰好有奇数条边,那么一开始先手的人可以通过这条边,并且把该边的权值减少到0;那么接下来,另一个游戏者必须沿着该方向走,而且只有两种选择,那就是对于接下来这边边是否减少到0。如果使边权减少到0,那么显然先手的人只要继续把下一条边减少为0就可以获胜了;假如不把比比安全减少到0,那么先手可以在下一点回走一步,并且把比边权减少到0,这样这是一个孤立的点了,后手无法行动。于是就得出了有必胜的策略。
对于两天的边数都不为奇数的情况为必败态也是很显然的。只需要按上面的思路假设两种情况就得出结论了。 贴代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int a[],n,m,k,ans1,ans2,t; int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=; i<=n; i++) scanf("%d",&a[i]);
for (ans1=; a[ans1+]!=; ans1++) ;
for (ans2=,k=n; a[k]!=; ans2++,k--) ;
if ((ans1&) || (ans2&)) printf("YES\n");
else printf("NO\n");
}
return ;
}