POJ 1012 約瑟夫問題

2021-09-08 16:24:50 字數 1238 閱讀 1604

/* 功能function description:     約瑟夫環+列舉  poj-1012

開發環境environment: dev c++ 4.9.9.1

技術特點technique:

版本version:

作者author: 可笑痴狂

日期date: 20120731

備註notes:

大致題意:

有k個壞人k個好人坐成一圈,前k個為好人(編號1~k),後k個為壞人(編號k+1~2k)

現在有乙個報數m,從編號為1的人開始報數,報到m的人就要自動死去。

問當m為什麼值時,可以使得在出現好人死亡之前,k個壞人先全部死掉?

ps:當前一輪第m個人死去後,下一輪的編號為1的人 為 前一輪編號為m+1的人

前一輪恰好是最後乙個人死掉,則下一輪迴圈回到開頭那個人報「1」

*//*

//**一:用順序表實現---列舉( 超時tle)

#include#includeint main()

; while(scanf("%d",&k),k)

printf("%d\n",joseph[k]);

return 0;}*/

//**三:用數學方法遞推

//出處:

/*遞推公式為:

ans[i]; //第i輪殺掉 對應當前輪的編號為ans[i]的人

ans[0]=0;

ans[i]=(ans[i-1]+m-1)%(n-i+1); (i>1 , 總人數n=2k 則n-i為第i輪剩餘的人數)

*///memory time

//184k 250ms

#includeusing namespace std;

int main(void)

; //打表,儲存各個k值對應的m值

int k;

while(cin>>k)

int n=2*k; //總人數

int ans[30]=; //第i輪殺掉 對應當前輪的編號為ans[i]的人

//ps:每一輪都以報數為「1」的人開始重新編號

int m=1; //所求的最少的報數

for(int i=1;i<=k;i++) //輪數

}joseph[k]=m;

cout<} return 0;

}

POJ 1012 約瑟夫問題

我是直接模擬的,因為實在想不到什麼好辦法,不過看到0 俗話說得好,不管黑貓白貓,抓到老鼠的就是好貓。於是在自家電腦模擬,打個表,就ac了。至於還有沒有其他方法,有待研究,大家有什麼好方法,請賜教,謝謝!1 模擬 方法是,m從2開始判斷,在1,2,3,2k中,每次找到第m個數,判斷如果是大於k的,那麼...

poj 1012 約瑟夫置換

一開始用的不是約瑟夫置換 關鍵是要儲存之前求出的值。因為只有13個數,所以也可以另開程式手動求出所有k值塞進陣列,這樣每次查詢都是o 1 0ms了 首先m值必須在 k 1 2kn,2k n 1 n 0,1,2 之間,然後 列舉。include include include include incl...

POJ 1012 約瑟夫環

poj的約瑟夫環問題是原本約瑟夫環的一種變形。約瑟夫環 有n個人,從第乙個人開始報數,數到第m個人就退出,依次迴圈,最後剩下的人為勝利者。可以用迴圈鍊錶和陣列的方法做,當m,n比較小時可以一試 迴圈鍊錶,數到就刪除,數到只剩乙個就輸出 陣列,第0個位置數值置為n,其他照常 a 1 1,a 2 2.數...