n個人做成一圈,順時針由1開始給他們編號,然後由第乙個人進行報數,數到m的人出局,接著下乙個人又從1開始報數,只剩最後乙個人的時候求這個人的編號
特例:當m = 2的時候
① n = 2^k
如果只有2個人,顯然剩餘的為1號如果有4個人,第一輪除掉2,4,剩下1,3,3死,留下1 。如果是8個人,先除去2,4,6,8,之後3,7,剩下1,5,除去5,又剩下1了
遞推,起始我們仔細分析也就是每次除去一半的元素,然後剩餘的一半繼續重複之前的策略,再除去一半。(可想到遞迴)
結合:j(2) = 1我知道兩個數,從1開始,肯定是2先死,剩下1.
得到:j(2^k)= 1
②當 n != 2^k (n = 9 11)
n 不等於2^k時,就不存在這樣的easy的規律了,重新分析:
假設n =9,這時候如圖下:
能看出來,我們
乾掉第乙個人也就是2
,之後就只剩下8個人了,又回到j(2^k)上了,
這時候我們需要的是找到當前的1號元素
。 見圖下:
這時候,我們從3號開始,就成了另外乙個規模小1的約瑟夫問題(恰好為2^k的特例)。
這時候,我們可以把3號看成新的約瑟夫問題中的1號位置:
j(8) = j(2^3) =1,也就是說這裡的1代表的就是上乙個問題中的3號
so:j(9) =3
答案為3號
同理可知所有的非2^k的數都是這樣:
【找到新的1號】
假設n = 2^k +t,t可以隨意取,比如1,2,3…….
假設n = 11,這時候n =2^3 +
3,也就是說
t = 3
,所以開始
剔除元素直到其成為2^k問題的約瑟夫問題
。 so,我們在剔除了t(3)個元素之後(分別是2,4,6),此時我們定格在2t+1(7)處,並且將2t+1(7)作為新的一號,而且這時候的約瑟夫環只剩下2^3,也就是j(2^3+ 3) = 2*3 + 1 = 7,答案為7
總結一下這個規律:
j(2^k + t) = 2t+1
3.當q不等於2的情況下:
當q≠ 2:
我們假定:
- n —n人構成的約瑟夫環
- q —每次移除第q個人
約定:
-jq(n)表示n人構成的約瑟夫環,每次移除第q個人的解
- n個人的編號從0開始至n-1
我們沿用之前特例的思想:能不能
由jq(n+1)的問題縮小成為j(n)的問題
(這裡的n是n+1規模的約瑟夫問題消除乙個元素之後的答案),jq(n)是在jq(n+1)基礎上移除乙個人之後的解。也就是說,我們能由jq(n)得到jq(n+1)。
規律:jq(n+1) = (jq(n) + q ) / (n+1)
初始情況: 0, 1, 2......n-2, n-1 (共n個人)
第乙個人(編號一定是(m-1)%n,設之為(k-1),讀者可以分m=n的情況分別試下,就可以得出結論) 出列之後,
剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k==m%n的人開始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ...,k-3, k-2
現在我們把他們的編號做一下轉換:
x'-> x
k --> 0
k+1 --> 1
k+2 --> 2
......
k-2 -->n-2
k-1 -->n-1
變換後就完完全全成為了(n-1)個人報數的子問題,假如我們知道這個子問題的解:例如x是最終的勝利者,那麼根據上面這個表把這個x變回去不剛好就是n個人情況的解嗎!
x ->x'
?(這正是
從n-1時的結果反過來推n個人時的編號
!)0 -> k
1 -> k+1
2 -> k+2
......
n-2 -> k-2
變回去的公式
x'=(x+k)%n
那麼,如何知道(n-1)個人報數的問題的解?只要知道(n-2)個人的解就行了。(n-2)個人的解呢?只要知道(n-3)的情況就可以了---- 這顯然就是乙個遞迴問題:
令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果就是f[n]
遞推公式
f[1]=0;
f[i]=(f[i-1]+k)%i =(f[i-1] +m%i) % i = (f[i-1] + m) % i ; (i>1)
class joseph:
def getresult(self, n, m):
# write code here
res = self.josephus(n,m)
return res + 1
def josephus(self,n,m):
if n == 1:
return 0
else:
return (self.josephus(n-1,m)+m)%n
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫環1
有n個小孩圍成一圈,給他們從1開始依次編號,現指定從第w個開始報數,報到第s個時,該小孩出列,然後從下乙個小孩開始報數,仍是報到s個出列,如此重複下去,直到所有的小孩都出列 總人數不足s個時將迴圈報數 求小孩出列的順序。input 第一行輸入小孩的人數n n 64 接下來每行輸入乙個小孩的名字 人名...