POJ 1063 Flip and Shift(找规律题)
来源:互联网 发布:mac视频播放器 mpv 编辑:程序博客网 时间:2024/05/17 07:38
题意:有个椭圆形轨道,上面放着一些黑色和白色的磁片,然后有个十字门,Flip的效果,十字门可以转动,(转换方式,例:1 32,转换就成了2 1 3),中间不换,交换两边的数字。shift就是平移一个位置,意思就是filp的效果在各个位置都能使用。
分析:首先,如果输入的n是奇数的话,奇数环,所有的位置都能转到,所以肯定成立,YES
上面完全是自己的思路,耗的空间稍微大一点。
网上大牛的思路:
如果是偶数,则统计在奇数位上和偶数位上白棋的个数,如果他们相差小于2,那么也一定是'YES'。
介个,开始做的时候,自己能力不足,确实没找到这样的规律,⊙﹏⊙。
网上分析:
若椭圆轨道上的凹槽个数N为奇数,则一定可以将两种颜色的碟子完全分开(取一黑色的碟子,假如这个黑碟原来在偶数位置上,那么当它沿某一固定方向与其他碟子交换一周后会位于奇数位置上。如:原来有11个凹槽,该黑碟原来在位置2上(凹槽起始位置为1),按i+2的方向交换,换到10号位置时,再交换一次便到1号位置上了。所以说,若N为奇数,则某个碟子可以位于任意位置,则一定可以分开。)
贴下我的代码:(248k,0ms)
C++语言:
#include<iostream>
usingnamespacestd;
intmain()
{
int t;
int n;
int i,j;
cin>>t;
while(t--)
{
inta[35]={0};
intsum =0;
inttemp_sum = 0;
inttemp =0;
cin>>n;
for(i=0;i< n ; i ++)
{
cin>>a[i];
sum+=a[i];
}
if(n%2==0) //n为偶数时
{
for(i=0 ; i < n ; i++) //思路:将所有的1移到最前面去,如果 a[i] == 0,a[j] == 1,同时j -i的值是偶数
{
if(a[i]==0)
{
for(j=n-1 ;j > i ; j--)
{
if((a[j]==1)&&((j-i)%2==0))
{
a[i]=1;
a[j]=0;
break;
}
}
}
}
for(i=0 ;a[i]!=0 ; i ++)
{
temp_sum+= a[i];
}
usingnamespacestd;
intmain()
{