【洛谷1288】取数游戏II

原题:

题目中有两个需要注意的地方

一个是每次移动可以减少任意多数,另一个是保证至少有一个0

这两个我一开始都没看见,结果居然还想出一个结论 = =

长年读题苦手,wtcl T_T

既然保证至少有一个0,那么可以考虑一个极端的先手必胜的情况

那就是存在一个方向,使得沿这个方向走奇数条边能碰到一个0边

那么先手每次把这个方向上的边清掉,后手就莫得选

不管后手是否把下一条边拿完,只要先手继续推着往前走,他就没有机会再去管那条边

那么如果先手两边有一种方向长度为奇数,他就必胜

如果两边都是偶数,那么不管往哪里走,后手就出现了一条奇数路径,后手必胜

所以判一下起点两个方向的路径奇偶性即可

那么问题来了

每次移动只能减少1,不保证有0的时候该怎么做呢

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,a[110];
 5 int main(){
 6     cin>>n;
 7     for(int i=1;i<=n;++i)  scanf("%d",&a[i]);
 8     int mk1=0,mk2=0;
 9     for(mk1=1;mk1<=n && a[mk1]!=0;++mk1);
10     for(mk2=n;mk2>=1 && a[mk2]!=0;--mk2);
11     cout<<((mk1-1)%2==1 || (n-mk2)%2==1 ? "YES" : "NO")<<endl;
12     return 0;
13 }
View Code
原文地址:https://www.cnblogs.com/cdcq/p/12691845.html