約瑟夫環問題

2021-07-27 16:53:15 字數 914 閱讀 6601

假設問題是從n個人編號分別為0...n-1,取第k個,

則第k個人編號為k-1的淘汰,剩下的編號為  0,1,2,3...k-2,k,k+1,k+2...

此時因為從剛剛淘汰那個人的下乙個開始數起,因此重新編號

把k號設定為0,則

0,1,2 ...n-k,n-k+1

n-k,n-k+1...0,1,2...

假設已經求得了n-1個人情況下的最終勝利者儲存在f[n-1]中,則毫無疑問,該勝利者還原到原來的真正編號即為 (f[n-1]+k)%n (因為第二輪重新編號的時候,相當於把每個人的編號都減了k,因此重新+k即可恢復到原來編號)。由此,我們可以想象,當最終只剩下乙個人的時候,該人即為勝利者,此時重新編號,因為只有乙個人,所以此時f[1]=0

這樣f[2]=(f[1]+k)%2,這樣就可以求出最終勝利者在2個人的時候的情況下的編號,由遞推公式f[n]=(f[n-1]+k)%n,可遞推到最初編號序列中該勝利者的編號。

因此用這個方法,只需一遍on的掃瞄,即可求出最終答案

不過該題要求編號從1開始,只要把f[n]+1即可,同時,該題指定了第乙個要刪除的人必須為編號為m的人,其實也不難,求出f[n]之後,把原本編號為0的位置移到跟m只相距k的位置即可實現第一次刪除的編號為m。所以最終 ans=(f[n]+1+m-k);

因為m-k可能為負數,導致整個ans為負,這樣其實最後+n即可解決。

遞迴**:

#include int josephus(int n, int m)   

else

}

int main()

scanf("%d", &m);

printf("%d\n", josephus(n, m)+1);

} return 0;

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...