【洛谷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 }