洗牌问题解答

原创 2006年05月23日 17:33:00

洗牌问题

 

2n张牌分别标记为1, 2, ..., n, n+1, ..., 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, ..., 2n, n。即前n张牌被放到偶数位置2, 4, ..., 2n,而后n张牌被放到奇数位置1, 3, ..., 2n-1。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。现在你的的任务是计算对于给定的n的值(n10^5),最少需要经过多少次洗牌可恢复到初始状态。

 

输入输出格式

 

输入数据由多组数据组成。每组数据仅有一个整数,表示n的值。

 

对于每组数据,输出仅一行包含一个整数,即最少洗牌次数。

 

样例输入

 

10

 

样例输出

 

6

 

 

程序代码如下:

#include <iostream>
void main()
{
 int i,j,k=0,p1,p2,n,*s1,*s2;
 printf("输入n:");
 scanf("%d",&n); 
 p1=1;p2=n+1;  //p1指向第一张牌,p2指向第n+1张牌
 s1=(int *)malloc(2*(sizeof(int)*(n+1))); //为数组s1动态申请2*(n+1)个空间
 s2=(int *)malloc(2*(sizeof(int)*(n+1))); //为数组s2动态申请2*(n+1)个空间
 //s1=new int[2*n+1]; 
 //s2=new int[2*n+1];
 for(i=1;i<=2*n;i++)
  s1[i]=i;   //牌的初始化,将其按编号存储到S1数组国 
 while(1)
 {
  for(i=1;i<=2*n;i++)  //根据洗牌规则将s1中的数搬到s2中
  {
   if(i%2!=0)
    s2[i]=s1[p2++];
   else
    s2[i]=s1[p1++];
  }  
        p1=1;p2=n+1;k++; //洗完一次牌后,p1,p2复位,洗牌的次数加1 
  for(j=1;j<=2*n-1;j++)  //判断牌是否已经按顺序存放
  { if(s2[j]<s2[j+1]) continue;
    else break;
  }
  if(j==2*n) {printf("经过了 %d 次洗牌/n",k); break;} //如果牌已经洗好
  for(i=1;i<=2*n;i++)  //根据洗牌规则将s2中的数搬到s1中
  { if(i%2!=0)
    s1[i]=s2[p2++];
   else
    s1[i]=s2[p1++];
  } 
  p1=1;p2=n+1;k++; //洗完一次牌后,p1,p2复位,洗牌的次数加1  
  for(j=1;j<=2*n-1;j++)  //判断牌是否已经按顺序存放
  { if(s1[j]<s1[j+1]) continue;    
    else  break;
  }
  if(j==2*n) {printf("经过了 %d 次洗牌/n",k); break;} //如果牌已经洗好
 }
}

相关文章推荐

hdu 1210 追踪法求解洗牌问题

网上搜的。。。 证明: 定理1:当第一张牌(牌1)回到初始位置时,所有的牌都回到了初始位置。 证明:设有一次操作,某牌在操作前处于位置r(1 将两个式子综合,可以得到r'= (r*2)%(...

洗牌问题 FZU - 1062 (传说中的思路题,hhh)

设2n张牌分别标记为1, 2, …, n, n+1, …, 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, …, 2n, n。即前n张牌被放...

FZU 1062 洗牌问题(打表找规律)

洗牌问题Problem Description设2n张牌分别标记为1, 2, …, n, n+1, …, 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n...

hdu1210Eddy's 洗牌问题(数学规律)

Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...

hdu1210Eddy's 洗牌问题 和 hdu 1209 Ignatius and the Princess IV 和hdu 1273漫步森林

hdu1210Eddy's 洗牌问题 //求交叉换位循环最后和原串相同的次数 #include #include #include using namespace std; int mai...

完美洗牌问题(打乱数组间各元素的顺序)

除了前一篇的完美洗牌问题,还有一种洗牌,就是乱序(shuffle)的问题,将54张有序的扑克牌的顺序打乱,实现洗牌操作。局部洗牌法1。随机产生一个1-n的数x,做为第一张牌。 2。随机产生一个1-(...

【编程之法】2.9 完美洗牌问题

经典完美洗牌问题 样例输入 10 1 2 3 4 5 6 7 8 9 10 样例输出 Perfect Shuffle:6 1 7 2 8 3 9 4 10 5...

FZU1062 洗牌问题(找规律)

题目:  Problem 1062 洗牌问题 Accept: 1144    Submit: 2324 Time Limit: 1000 mSec    Memory Limit :...

HDU-洗牌问题

问题及代码: /* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:card.cpp *作 者:单昕昕 *...
  • MIKASA3
  • MIKASA3
  • 2015年02月03日 14:33
  • 453

完美洗牌问题

 完美洗牌问题: (一)有长度为2n的数组{a1,a2...an,b1,b2...bn},希望排序后为{a1,b1,a2,b2...an,bn},希望时间复杂度为O(n),空间复杂度为O(1)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:洗牌问题解答
举报原因:
原因补充:

(最多只允许输入30个字)