#include<stdio.h>
int main()
{
int T, n, x, c1, c2;
scanf("%d", &T);
while(T--)
{
c1 = c2 = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
if(n % 2 == 1)
continue;
if(x == 1 && i % 2 == 1)
c1 ++;
else if(x == 1 && i % 2 == 0)
c2 ++;
}
if(n % 2 == 1)
{
printf("YES\n");
continue;
}
if(c1 - c2 <= 1 && c2 - c1 <= 1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
感想:第一眼看到这个题,就觉得用位运算加广搜做,不过,真正动手才发现没有这么大的数组来标记。
后来帅哥学长说,要是他看见后面的结果仅仅是YES或者NO就肯定不会用搜索做,肯定有规律。
思路:这个题看似每次都有两种操作,一是向后转动一个位置,二是调换选定三个中首位的位置,但真正上他就一种操作,调换第i个和第i+2个(或第i-2个)的位置。
1.如果总数n为奇数的话,那么偶数位置上的1都可以换到奇数位置上,奇数位置上的1也可以换到偶数位置上,那么这肯定可以。
2.如果总数n为偶数的话,那么,偶数位置上的1无论如何都不能换到奇数位置上,奇数位置也不能换到偶数位置,而要达到最终的状态(1都放一起),假设1的个数为 k,那么如果k为偶数,则奇数位上的1和偶数位上的1个数相等;如果k为奇数,那么奇数位上的1和偶数位上的1个数一定相差1。
铭记:看见这样很像搜索的题,要先看看它要求你输出的是什么,这个题只要你输出YES或者NO,而不是输出最少步数,也就是说他不要你中间一大部分的过程,那就说明这 个题很可能有规律。