N bulbs
Accepts: 275
Submissions: 1237
Time Limit: 10000/5000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
N个灯泡从左到右排成一排,左边的是第一个,右边的最后一个,下标从1到n。有些开着,有些关着,为了节约用电,你要关上所有灯,但是你又很懒。 刚好有个熊孩纸路过,他刚好要从第一个灯泡走去最后一个灯泡,然后离开。 熊孩子从第一个灯泡出发,每次可以往左右两个相邻的灯泡走。 但是毕竟熊孩纸,熊孩纸在离开一个灯泡之前,一定会动一下当前这个灯泡的开关,也就是开的变关,关的变开。 想问你可不可能关完所有的灯,同时熊孩纸也可以到达最后一个灯泡,然后离开。
输入描述
第一行T,表示T组数据。 接下来T组数据: 每组数据,第一行N,后面一行一个01序列,表示灯泡的初始开关状态,0表示关,1表示开。 1≤T≤10 1≤N≤1000000
输出描述
每组数据,如果可以输出"YES",否则输出"NO"。
输入样例
1 5 1 0 0 0 0
输出样例
YES
Hint
孩子的路径是:123234545 刚好除了第一盏灯,其他灯都只经过偶数次。
发现就是如果该位置是1的话,那么经过这个位置可以直接到达下一个位置。
如果该位置是0的话,想要到达下一个位置,下一个位置的值需要取反。这样一直走直到最后一个位置。
代码:
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
#define INF 0x3fffffff
const int maxn = 1000005;
int n;
int val[maxn];
int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout);
int i, t;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &val[i]);
}
for (i = 1; i <= n - 1; i++)
{
if (val[i] == 0)
{
val[i + 1] = 1 - val[i + 1];
}
else
{
continue;
}
}
if (val[n])
{
puts("YES");
}
else
{
puts("NO");
}
}
//system("pause");
return 0;
}