約瑟夫問題解法,不是最優解

2021-09-25 13:25:07 字數 1147 閱讀 7492

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。 [1]

17世紀的法國數學家加斯帕在《數目的遊戲問題》中講了這樣乙個故事:15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法:30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次投入大海的都是非教徒。

package classics;

import lib.listnode;

/** * 約瑟夫問題,

* 39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,

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

* 直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,

* 越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。

* 這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,

* 一開始要站在什麼地方才能避免被處決?

* josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

*/public class yuesefuproblem

listnode star = new listnode(0);

listnode p = star;

//初始化這個鍊錶

for(int i=1;i探索最優解:就

最優解問題

最優解問題題型隱晦 變化多端,所以總結此類題目的特徵 解法歸類有助於我們更快的想到這類題目的解題方法 佔坑!後續補充 最優解題目特徵 解題思路1 貪心思想 例題 九度oj題目1434 今年暑假不ac 分析過程 乙個節目提供了三個引數 開始時間 結束時間 持續時間。思考開始最早的元素是不是第乙個最優解...

最優解問題

新龜兔賽跑 要求烏龜到達終點的最優解,無非就是貪心,dp,和bfs,dfs.等等方法了,貪心已經排除了,因為我發現,開始的時候我只是把倒數第乙個站點作為終點去考慮,題目中給的測試資料只有三個,當讓是能過的,但是當站點比這多時,這樣做就行不通了,我們只有把每個站點都作為一次終點去考慮,求烏龜到改點時的...

約瑟夫問題數學解法

寫完密碼約瑟夫就想到原來看到約瑟夫問題的乙個數學解法 很巧妙很簡單 不過只能推出最後乙個出列的人 無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意...