POJ 1012(约瑟夫问题)

8 篇文章 0 订阅
4 篇文章 0 订阅

       我是直接模拟的,因为实在想不到什么好办法,不过看到0<k<14偷笑

     俗话说得好,不管黑猫白猫,抓到老鼠的就是好猫。

     于是在自家电脑模拟,打个表,就AC了。

     至于还有没有其他方法,有待研究,大家有什么好方法,请赐教,谢谢!

1、模拟:

   方法是,m从2开始判断,在1,2,3,······,2k中,每次找到第m个数,判断如果是大于k的,

   那么后面的数就向前移,否则m++,直至找到这样的m,使得找出的k个数都是大于k,

   这个m就是要找的最小的m。(也可以使用链表,不过本人还没学过链表,所以不在这介绍了,

   可参考百度百科:http://baike.baidu.com/view/213217.htm?fr=aladdin

#include<stdio.h>
int main()
{
    int k,m,i,n,x,j;
    int a[27];
	bool bo;
    scanf("%d",&k); 
    while(k)
    {
	 for (i=1;i<=2*k;i++) a[i]=i;
     m=1;
	 bo=false;
     while(!bo)
     {  
       m++;x=1;bo=true;
       for (i=2*k;i>=k+1;i--)
       {
           n=m%i;
             if (n==0) n=i;
               n=(n+x-1)%i;
                 if (n==0) n=i;       
                    if (a[n]<=k) 
		     {
			bo=false;
			break;
		     }
		  for (j=n;j<i;j++) a[j]=a[j+1];
		  x=n;
       }
     }
     printf("%d\n",m);
     scanf("%d",&k);
    }
   return 0;
} 

2、绝对0s算法:

#include<stdio.h>
int main()
{
	int k,a[13]={2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
	scanf("%d",&k);
  while(k)
  {
	printf("%d\n",a[k-1]);
    scanf("%d",&k);
  }
  return 0;
}




题目来自: http://poj.org/problem?id=1012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值