演算法學習筆記 約瑟夫問題

2021-10-04 08:38:15 字數 1979 閱讀 5136

據說著名猶太歷史學家 josephus有過以下的故事:

在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。

然而josephus 和他的朋友並不想死,那麼約瑟夫及其朋友應該怎樣安排自己得位置才能逃過一劫?

有n個人圍成一圈,順序排號。

從第乙個人開始報數(從1到3報數),凡報到3的人退出圈子,重新計數。

迴圈直到剩下最後n個人

n =

int(

input

("輸入n: "))

# 輸入總人數

ll =

[i +

1for i in

range

(n)]

# 生成佇列

print

(ll)

suvivor =

2# 設定最後得倖存者

i =0

l =len

(ll)

k =1

# 報數

while l > suvivor:

if i ==

len(ll)

:# 報數結束,從第乙個人重新開始報數

i =0if k ==3:

# 0. 報數到 3:

print

("kill : "

, ll[i]

) ll.pop(i)

# 1. 移除這個人

l =len(ll)

# 2. 新的佇列長度

k =1# 3. 報數回歸到1

i -=

1# 4. 因為刪掉乙個人,所以當前座標 -1,否則後面座標加上以後,就會出錯。

else

: k +=

1 i +=

1print

(ll)

輸入n:41[

1,2,

3,4,

5,6,

7,8,

9,10,

11,12,

13,14,

15,16,

17,18,

19,20,

21,22,

23,24,

25,26,

27,28,

29,30,

31,32,

33,34,

35,36,

37,38,

39,40,

41]kill :

3kill :

6kill :

9kill :

12kill :

15kill :

18kill :

21kill :

24kill :

27kill :

30kill :

33kill :

36kill :

39kill :

1kill :

5kill :

10kill :

14kill :

19kill :

23kill :

28kill :

32kill :

37kill :

41kill :

7kill :

13kill :

20kill :

26kill :

34kill :

40kill :

8kill :

17kill :

29kill :

38kill :

11kill :

25kill :

2kill :

22kill :

4kill :35[

16,31]

演算法學習之約瑟夫環問題

問題 假設下標從0開始,0,1,2 m 1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的乙個人的編號是多少?我的理解 設f m,k,i 為m個人的環,報數為k,第i個人出環的編號,m個人的環第i個出來的人就相當於m 1個人的環第i 1個出來的人,不過這個序號是相當於原來m個人的序號。但...

演算法 學習筆記

1.輸入輸出演算法至少有乙個或多個輸出 2.有窮性 3.確定性 4.可行性 1.正確性a.演算法程式沒有語法錯誤 b.演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果 c.演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果 d.演算法對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果...

演算法學習筆記

複雜度分析 1.只關注迴圈次數最多的一行 2.總複雜度等於量級最大 的複雜度 3.巢狀 的複雜度等於巢狀 內外複雜度的乘積 單鏈表結構和順序儲存結構的優缺點 儲存分配方式 時間效能 空間效能 單鏈表結構 用一組任意的儲存單元存放線性表元素 查詢 o n 插入和刪除 找到某位置的指標後,插入和刪除的時...