pku2244約瑟夫環問題

2021-06-16 05:12:40 字數 779 閱讀 3499

【題意】

n個城市(標號1,2,....,n)輪流斷網,先停1號城市,然後每m個城市斷網,斷了的就不用計入在內了。

【分析】

約瑟夫環殺人遊戲的乙個變種。

自己總算能用之前的公式套了。

我們已知的結論是:

f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n],遞推公式:

f[1]=0;

f[i]=(f[i-1]+m)%i;  (i>1) //注意這裡%i,i表示當前算的數,計算f[2],則i=2,計算f[3],則i=3,開始我搞錯了。

本題1號城市首先斷網,所以對於給定的n,我只需要計算出最小的m,使得f[n-1]=0即可;

道理是:1號城市已經斷網了,再以後的迴圈就不會再有1介入,要使2號城市最後斷網(最後勝利者)也就是使剩下n-1個城市的第乙個城市成為勝利者,而我們公式裡的編號是從0開始的,第乙個城市的編號在答案裡就是0;

依據上面的分析,題目n,3<=n<150,我們可以先處理出所有的n,對於每乙個n,列舉m,當f[n]=0時,我們就得到了結果,儲存之,具體見**。

【**】

/*2244 accepted 136k 16ms c++ 518b 2011-01-19 20:45:46 */

#include

#include

int f[152],ans[152];

void init()

}}       

}           

int main()

後來找了網上的一篇題解:

poj 2244 約瑟夫環

這裡在推一遍公式 由於每次都是由1開始,所以可以把1排除掉,直接將城市數變成k 1,把2當作1.k 1 1 n n k n 1 就是原來的1 n k 1 k n 2 n 1 本輪x 下一輪x 但是本輪只剩下n 1個數了,而編號還是從1 n 中間缺少了ans i 1 中斷了,而下一輪是連續的 所以重新...

pku1012 hdu1443約瑟夫環問題

pku1012我寫了個鍊錶的暴力來直接打表發現只能打到k 9,到10就執行不了了 在下面,而網上這一篇寫的打表居然可以,下面是我的草稿 include include struct link head,p,fp int f 15 void create int n p next head int s...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...