1. 程式人生 > >Joseph POJ - 1012 約瑟夫環遞推

Joseph POJ - 1012 約瑟夫環遞推

平移 bsp int std pre style tdi printf end

  題意:約瑟夫環 初始前k個人後k個人 問m等於多少的時候 後k個先出去

  題解:因為前k個位置是不動的,所以只要考慮每次遞推後的位置在不在前面k個就行

  有遞推式 ans[i]=(ans[i-1]+m-1)%(n-i-1) 其中i是輪數 ans[i]是i出局的位置 出局後後面的補到前面 也就是i+1輪開始的位置了 m是數多少個出去

  這裏的是從0開始的,而題目是從一開始 ,平移一下即可 只要ans[i] 前K次不落在前K個即可 打表也行

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
#include<algorithm> 5 using namespace std; 6 int ans[1005]; 7 int a[3000]; 8 int main(){ 9 int n; 10 while(cin>>n&&n){ 11 n*=2; 12 ans[0]=0; 13 if(a[n/2]){ 14 cout<<a[n/2]<<endl; 15 continue; 16 } 17 for(int i=1;;i++){ 18 int ok=1; 19 for(int j=1;j<=n/2
;j++){ 20 ans[j]=(ans[j-1]+i-1)%(n-j+1); 21 if(ans[j]<n/2){ 22 ok=0; 23 break; 24 } 25 } 26 if(ok){ 27 printf("%d\n",i); 28 a[n/2]=i; 29 break; 30 } 31 } 32 } 33 return 0; 34 }

Joseph POJ - 1012 約瑟夫環遞推