每日一練 no 18 約瑟夫問題

2021-09-01 12:42:40 字數 1343 閱讀 7713

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

在羅馬人占領橋塔帕特後,39個猶太人與 josephus 及他的朋友躲到乙個洞中,

39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,

由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,

直到所有人都自殺身亡為止。然而 josephus 和他的朋友並不想自殺,

問他倆安排的哪兩個位置可以逃過這場死亡遊戲?

模擬推導:

使用collections模組deque進行模擬:

import collections

defysf

(a, b)

: d = collections.deque(

range(1

, a+1)

)# 將每個人依次編號,放入到佇列中

while d:

d.rotate(

-b)# 佇列向左旋轉b步

print

(d.pop())

# 將最右邊的刪除,即自殺的人

if __name__ ==

'__main__'

: ysf(41,

3)# 輸出的是自殺的順序。最後兩個是16和31,說明這兩個位置可以保證他倆的安全。

數學推導:

n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。

我們知道第乙個人(編號一定是m%n-1) 出列之後,剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k=m%n的人開始): k k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2,並且從k開始報0。

假設x是最終的勝利者,逆推的話容易得到 x』=(x+k)%n ,可以以此逆推到最開始的位置。

# 遞迴直接求出

defysf

(m,k)

:if m ==1:

return

0else

:return

(ysf(m-

1, k)

+k)% m

ysf(41,

3)+1

# 遍歷求出結果

defysf

(m, k)

: s =

0for i in

range(2

, m+1)

: s =

(s + k)

% i return s

ysf(41,

3)+1

每日一練4

員工表emp 員工編號eid,姓名ename,工作職位title,僱傭日期hiretime,工資salary,獎金bonus,部門depart 部門表dept 部門編號did,名稱dname,部門領導leader 員工資料 1001,張三 銷售 1999 12 1 3000.0,1100.0,102...

每日一練25

請描述 mysql 從安裝到配置的全部詳細過程 確保一台新電腦可以順利使用 mysql mysql安裝嚮導啟動,按 next 繼續 選擇安裝型別,有 typical 預設 complete 完全 custom 使用者自定義 三個選項,我們選擇 custom 有更多的選項,也方便熟悉安裝過程 選擇配置...

每日一練 13

談談你對ajax 的理解?概念 特點 作用 select 教師號,sum case when 星期號 1 and 是否有課 有 then 1 else 0 end as 星期一,sum case when 星期號 2 and 是否有課 有 then 1 else 0 end as 星期二,sum c...