假設問題是從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報數,如此下去,直到所有人...