【題意】
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個猶太人決定寧願死...