POJ 1063 Flip and Shift(找规律题)

来源:互联网 发布:mac视频播放器 mpv 编辑:程序博客网 时间:2024/05/17 07:38

题意:有个椭圆形轨道,上面放着一些黑色和白色的磁片,然后有个十字门,Flip的效果,十字门可以转动,(转换方式,例:1 32,转换就成了2 1 3),中间不换,交换两边的数字。shift就是平移一个位置,意思就是filp的效果在各个位置都能使用。

分析:首先,如果输入的n是奇数的话,奇数环,所有的位置都能转到,所以肯定成立,YES

           如果输入的n是偶数的话,偶数环。我的思路就是:将所有的1移到最前面去,如果 a[i] == 0,a[j] == 1,同时j -i的值是偶数的话,交换a[i]和a[j],如果到最后,从第一个位置开始往后数起,在a[i]不为0之前,相加的和是原来n个数据相加的和的话,说明就移动到一起了,然后是YES,否则就是NO。

 

上面完全是自己的思路,耗的空间稍微大一点。

网上大牛的思路:

如果是偶数,则统计在奇数位上和偶数位上白棋的个数,如果他们相差小于2,那么也一定是'YES'。

介个,开始做的时候,自己能力不足,确实没找到这样的规律,⊙﹏⊙。

网上分析:

若椭圆轨道上的凹槽个数N为奇数,则一定可以将两种颜色的碟子完全分开(取一黑色的碟子,假如这个黑碟原来在偶数位置上,那么当它沿某一固定方向与其他碟子交换一周后会位于奇数位置上。如:原来有11个凹槽,该黑碟原来在位置2上(凹槽起始位置为1),按i+2的方向交换,换到10号位置时,再交换一次便到1号位置上了。所以说,若N为奇数,则某个碟子可以位于任意位置,则一定可以分开。

   若椭圆轨道上的凹槽个数N为偶数,当奇数位置上的黑碟数与偶数位置上的黑碟数相差<=1时,一定可以完全分开(奇偶相嵌)。

贴下我的代码:(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]; 
         }
         if(temp_sum==sum)cout<<"YES"<<endl;
         elsecout<<"NO"<<endl;
      }
      else             //n为奇数时,所有位置都能转到
      {
         cout<<"YES"<<endl;
      }
   }
}
原创粉丝点击