1. 程式人生 > >最進遇到的問題

最進遇到的問題

遇到的問題文題目

思路簡介:

    約瑟夫問題是學連結串列結構時的老問題,一般用迴圈連結串列做,但由於連結串列解法複雜度為m*n,當m、n較大時,這種模擬運算較為浪費時間,但觀察一下,可以發現其中有一些規律。

比如說m為3,n我們從2開始,如果要使某位被選中最後獲勝,則其位置必定為1,即第2個人(按0、1、2數);而當n為3時,只有位置是第2個的人才會最後獲勝。

舉例:下圖(盜的)綠框為當n為11,m為3時,各輪元素所在位置;黃框為各輪被淘汰的元素;紅框為最後一個留下的元素。

            

據上表,可以這樣理解,當最後一輪淘汰開始的時候各元素的位置相當於最後第二輪各元素的位置向前移動了m(即3格),而前面3格的元素除了已被淘汰的,剩下的補充的隊伍後面。由此反過來可以理解:

遞推公式: 

           f(N,M)=(f(N1,M)+M)%N

f(N,M)表示,N個人報數,每報到M時殺掉那個人,最終勝利者的編號

f(N1,M)表示,N-1個人報數,每報到M時殺掉那個人,最終勝利者的編號

後面取模是因為防止前者相加過大,超過n。