約瑟夫環求解O n

2021-07-24 21:32:37 字數 664 閱讀 8158

有n個人,編號從0到n-1,圍成圈,從0開始報數,第m個人出列,然後繼續從第m+1個人不斷報數、出列,求最後剩下的人是哪個。

鍊錶模擬,時間複雜度為o(nm),比較簡單,就不贅述了。

考慮n個人0, 1, 2, 3, ..., n-1,從0開始報數到m,所以編號為m-1的人出列。

剩下m, m+1, m+2, ..., n-2, n-1, 0, 1, 2, ..., m-2,

然後對其重新從0開始編號,0, 1, 2, ..., n-1

可以發現新的編號和老的編號的關係為(new+m)%n = old。

舉個例子:n=9   m=4

0 1 2 3 4 5 6 7 8 編號為3的出列,

變成 4 5 6 7 8 0 1 2

對應 0 1 2 3 4 5 6 7

例子出自tingyun_say

所以遞推公式就出來了:

f(n, m) = ( f(n-1, m) + m ) % n;

o(n)複雜度的方案就醬。

貼上**:

約瑟夫環問題求解

約瑟夫問題如下 n個人圍成圈,依次編號為1,2,n,現在從1號開始依次報數,當報到m時,報m的人退出,下乙個人重新從1報起,迴圈下去,問最後剩下那個人的編號是多少?input amount 佇列人數 m 數到m時退出乙個人 output 最後乙個退出的人的下標 思路 用布林陣列做 我們可以把這amo...

約瑟夫環遞迴求解

約瑟夫環是乙個數學的應用問題 已知m個人 以編號1,2,3.m分別表示 圍坐在一張圓桌周圍。從編號1開始報數,每次報到k的那個人出列,然後下乙個人再從1開始報數。求解 最後乙個出列的人的編號。使用遞迴 假設有10個人,編號為1 2 3 4 5 6 7 8 9 10,k 3。從1開始報數,則第一次出列...

約瑟夫環問題求解

josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。提示 用乙個不帶頭結點的迴圈鍊錶來處理 j...