如果当前堆中物品的数量大于一,则当前要拿的人必胜,因为如果下一堆对应的状态是负状态的话,那么当前要拿的人可以将当前堆拿完,让对方去拿对应负状态的堆。如果下一堆对应的是胜状态的话,则把当前堆拿到剩余一件物品,对方把这一件拿走,然后就可以拿对应胜状态的下一堆了。
如果当前堆只有一件物品,则必须拿。
所以只用判断谁拿了物品数量大于一的堆即可。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005];
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int flag=1,ss=0;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<n;i++){
if(a[i]==1) flag ^= 1;
else{
if(flag) puts("Yes");
else puts("No");
ss=1;
break;
}
}
if(ss) continue;
if(flag) puts("Yes");
else puts("No");
}
return 0;
}