Description
N个灯泡从左到右排成一排,左边的是第一个,右边的最后一个,下标从1到n。有些开着,有些关着,为了节约用电,你要关上所有灯,但是你又很懒。刚好有个熊孩纸路过,他刚好要从第一个灯泡走去最后一个灯泡,然后离开。熊孩子从第一个灯泡出发,每次可以往左右两个相邻的灯泡走。但是毕竟熊孩纸,熊孩纸在离开一个灯泡之前,一定会动一下当前这个灯泡的开关,也就是开的变关,关的变开。想问你可不可能关完所有的灯,同时熊孩纸也可以到达最后一个灯泡,然后离开
Input
第一行T,表示T组数据。
接下来T组数据:
每组数据,第一行N,后面一行一个01序列,表示灯泡的初始开关状态,0表示关,1表示开。
1≤T≤10
1≤N≤1000000
Output
每组数据,如果可以输出”YES”,否则输出”NO”。
Sample Input
1
5
1 0 0 0 0
Sample Output
YES
Solution
总的操作次数是跟n同奇偶的,如果1的数量和n不同奇偶,那么一定无解。那么现在问题是1和n同奇偶的情况下,是不是一定有解?答案是显然的。因为1和n同奇偶,所以0的个数是偶数,我们发现当我们从1走到i时,假设我们往回走到左边某个点k,再走回来i,那么你会发现有且仅有 k和i这两个数被设成没有操作,也就是说我们可以每次任意选择两个点设成没有操作,然而不需操作的点数是偶数个,所以刚好可以满足。
Code
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int a,cnt=n%2;
while(n--)
{
scanf("%d",&a);
cnt=(cnt+a)%2;
}
if(!cnt)printf("YES\n");
else printf("NO\n");
}
return 0;
}