#31981: 進階概念 Josephus問題的log(n)解


seer852741@gmail.com (St418)

學校 : 國立中央大學
編號 : 170226
來源 : [114.24.161.39]
最後登入時間 :
2024-01-05 19:57:56
c296. APCS-2016-1029-3定時K彈 -- 2016年10月APCS | From: [220.129.91.56] | 發表日期 : 2022-09-03 17:02

請先閱讀其他篇解題報告!

 

上圖是一般的Josephus問題解法,原理是用逆推的方式推算出編號,時間複雜度為O(n)。

 

不過其實還能夠更快,我參考了以下兩篇文章,並做出修改:

约瑟夫问题(Josephus Problem)的两种快速递归算法 | 贫贫贫贫僧 (haoyuanliu.github.io)

約瑟夫問題的兩個O(log n)解法 | MaskRay

與之前的差別在於我是一圈一圈回推,而不是一個一個,詳細解釋看文章內容。

但我做出了幾個修改:

第一個if,是炸彈傳不到一圈就結束的情況,可以直接給答案,原文只有if (n == 1) return 0。

第二個if,是當炸彈傳一圈只能炸一次時,用遞迴無法有效簡化題目的情形,我將條件改成n < 2 * m,原文是n < m,原文的寫法無法精確表示上述情況。

至於遞迴的部分我就沒有多改了。

目前最快的演算法,有任何問題都歡迎提出!

 
ZeroJudge Forum