poj1063 Flip and Shift

#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,而不是输出最少步数,也就是说他不要你中间一大部分的过程,那就说明这               个题很可能有规律。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值