1. 程式人生 > >OI養老專題03:讓壞人出列的約瑟夫問題

OI養老專題03:讓壞人出列的約瑟夫問題

col 個人 ati 過去 n+1 pre 輸出 clu 壞人

  問題是這樣的:一共有2n個人,其中有n個好人,n個壞人。好人的編號是1~n,壞人的編號是n+1~2n。要求你求出最小的m(報數到m的人出局),讓前n個出局的人都是壞人。


  似乎除了暴力,我們想不出其它的什麽辦法來。而這題的數據範圍......n<14!!!!!!!那就直接暴力好了(滑稽)

for(int i=1;i<=n;i++){
    ans[i]=(ans[i-1]+m-1)%(2*n-i+1);
    if(ans[i]<n) i=0,m++;
}
printf(",%d",m);

  鬼知道它的復雜度是多少......不過就算是O(N3

)也是可以過的,這題就給我們水過去了。

  不過,這是正解嗎?你看這個範圍只有14,題目的變量也只有一個,這不是大喊著讓我們打表過嗎?所以為了rank,我打了個表......

#include<stdio.h>
#include<string.h>
int main(){
    //freopen("poj1012 約瑟夫問題2.txt","w",stdout);
    puts("#include<iostream>");
    puts("using namespace std;");
    printf("int ans[15]={0,2
"); int ans[20]; for(int n=2;n<14;n++){ int m=1; memset(ans,0,sizeof ans); for(int i=1;i<=n;i++){ ans[i]=(ans[i-1]+m-1)%(2*n-i+1); if(ans[i]<n) i=0,m++; } printf(",%d",m); } printf("};\n"); puts("int main(){
"); puts(" int n;"); puts(" cin>>n;"); puts(" cout<<ans[n];"); puts(" return 0;"); puts("}"); return 0; }

  而且是那種直接交輸出文件的打表程序(滑稽)

OI養老專題03:讓壞人出列的約瑟夫問題