n個數字(0,1,…,n-1)形成乙個圓圈,從數字0開始,每次從這個圓圈中刪除第m個數字(第乙個為當前數字本身,第二個為當前數字的下乙個數字)。當乙個數字刪除後,從被刪除數字的下乙個繼續刪除第m個數字。求出在這個圓圈中剩下的最後乙個數字。
這個問題在wiki上叫約瑟夫斯問題。
一開始的序列是
s(n): n-1, 0, 1, 2, 3, ...., n -2 (乙個環)
刪除了第k=(m-1)%n個數,之後變成
s': n-1, 0, 1,2,...,k-1,k+1,...,n-2
s(n-1): n-2, 0, 1,2,3, ...,n-3
將s(n-1)按照f(x)=(x+k+1)%n 進行對映可以得到s',也就是0->k+1, 1->k+2....
將s'繼續刪除第k個數,以此類推,最後乙個序列,也是可以通過s(1)來對映。
s' = (s(n-1) + (m-1)%n + 1) % n = (s(n-1) + m) % n.
那麼對於每個序列的最後乙個數, 也是滿足這個對映。
f(n) = (f(n-1) + m) % n.
當n==1的時候,只有乙個數,那麼最後乙個數肯定就是0,f(1) =0.
然後就可用動態規劃去做了。
這裡提到的第二種方法為什麼會是$o(k\log n)$,沒想明白? 把殺掉k-th, 2k-th, ..., $(\lfloor n/k \rfloor k)$-th當個步驟,所以總共需要k步。那也就是說,重新編號的開銷是$\log n$.怎麼做到的?
求在這個圓圈中剩下的最後乙個數字
第18題 陣列 題目 n個數字 0,1,n 1 形成乙個圓圈,從數字0開始,每次從這個圓圈中刪除第m個數字 第乙個為當前數字本身,第二個為當前數字的下乙個數字 當乙個數字刪除後,從被刪除數字的下乙個繼續刪除第m個數字。求出在這個圓圈中剩下的最後乙個數字。coder lee 20120227 incl...
圓圈中最後剩下的數字
1.問題描述 題目0,1.n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。來自 劍指offer 2.分析 1 用環形鍊錶模擬圓圈,然後掃瞄鍊錶刪除結點,如果掃瞄到了鍊錶結尾,重新在指向鍊錶開頭以此來模擬環形鍊錶。typedef struct...
圓圈中最後剩下的數字
題目描述 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任...