本人比較笨,約瑟夫問題的求解方法想了好久才想通,在這裡留一篇文章,記錄一下。
約瑟夫問題:n個人,數m,列出順序。
1,用演算法模擬數數過程,通過乙個乙個的排除,最後得到最終的結果:
首先解決思路問題,每次數數m個,一共數n次,所以一共經過n*m次,然後定義乙個int t,用來算作每個人報數的時候報出的數,
然後沒報一下,判斷所在的是否還存在,只有兩個問題,乙個是是否到了末尾,如果到了末尾就轉到前面去;然後判斷是否已經數出,如果數出,直到
沒有數出的數為止做while迴圈。每次做完乙個m,就要歸零(輸出乙個被數出的人),因為是從零開始的,所以輸出的人要加上1.
for(int i=0;i上述的演算法s
2.用遞推的方法求解:
因為直接要求的最後的乙個人用以下形式來表示:
0 1 2 3 4 5 。。。。。 n-1,
在排除第乙個人的時候,當n》m時,排除的是第m個,(代號為m-1),當n》m時,第n-m個,排除的是(n-m-1),所以排除的是第m mod n個
再將所有的重新排列一下為
m m+1 m+2 m+3 。。。。n-1 0 1 2 3 。。 m-2,,將其看作從
0 1 2 3 4 。。。。。 n-2,根據前面的算式,轉換成n-1個人的約瑟夫問題,如果知道是第x個人是n-1個人約瑟夫問題的最後的人,根據以上的表,就能夠知道第n人的約瑟夫問題最後乙個人是誰
所以關鍵就是求出遞推關係,怎麼從n-1人的約瑟夫問題的解轉換到n人約瑟夫問題的解:
n-1個人約瑟夫問題(x)的第二重排除根據n人約瑟夫問題(x『)來推導,x'=(x+m) mod n
(如果第0是最後勝利者,則m mod n=m為最後勝利者)
以後就是根據遞推關係,根據1人約瑟夫問題的解為它本身,求出n人約瑟夫問題的解
#include
using namespace std;
int main()
cout<
LintCode 求取A B的問題
分析 1.首先我們想到的方法肯定是直接使用 等運算子,例如return a b,如果直接使用算術運算子,那麼這道題就沒有任何意義了。2.大家都知道咋們鍵入的一系列指令 資料等最終都會被計算機轉化為對應的二進位制資料來識別,所以除了直接使用算術運算子,還有一種方法就是基於二進位制資料使用位運算。通常情...
gef直接編輯的思路
攔截編輯的事件,在同樣的位置,同樣的大小,用text來覆蓋。首先需要在原有的基礎上多加兩個類 edirecteditmanager 直接編輯管理類 ecelleditorlocator 單元格的編輯的位置 public class ecelleditorlocator implements cell...
H On簡結 思路超清晰的解釋約瑟夫環問題
在一年半前還是個新生,第一次接觸專業的程式設計教育的我刷題刷的很起勁,經典的猴子選大王問題就是在那時候遇到的,那時候我花了好久,用陣列加判斷實現了模擬選人,最終做出來了這道題。如今已經熟練了掌握各種容器,對程式設計的理解也不可同日而語,但模擬已經不能滿足如今的需要了。好久以前老師曾助教新生時發現乙個...