POJ 1012(約瑟夫問題)

       我是直接模擬的,因爲實在想不到什麼好辦法,不過看到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

發佈了43 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章