很早就看到過這個題目了,當時都是用迴圈鍊錶做的,這樣可以逐次節省記憶體。
沒想到,這卻可以用幾行**用數學方法輕鬆實現~
參考了學長alex4814的部落格,原來借助抽象函式f(n)可以解釋得更清楚。
n個人編號:0,1,2,……,k-2,k-1,k,……,n-1;//包含0的話剛好是n的完全剩餘系,更方便討論
抽去第k人:0,1,2,……,k-2,k,……,n-1;//編號為k-1的是第k人
只剩下了n-1個人,相當於乙個環減去了一節,重新安置頭和尾:
k,k+1,……,n-1,0,1,2,……,k-2;
(x+k)%n
n-1個人編號:0,1,2,……,k-1,k,k+1,……,n-2;x
於是問題化簡到了n-1個人的求解問題。並且這兩個數列除了k-1有一一對應的關係
設f(n)是n個人裡倖存者的編號,那麼:f(n)=(f(n-1)+k)%n
並且顯然,有:f(1)=0
依次可以得到1,2,3,……,n人對應的倖存者編號;
題目給的編號是從1開始的,平移即可。
#include int main()
return 0;
}
poj 3517 約瑟夫環。。。。。
無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...
POJ 1012 約瑟夫問題
我是直接模擬的,因為實在想不到什麼好辦法,不過看到0 俗話說得好,不管黑貓白貓,抓到老鼠的就是好貓。於是在自家電腦模擬,打個表,就ac了。至於還有沒有其他方法,有待研究,大家有什麼好方法,請賜教,謝謝!1 模擬 方法是,m從2開始判斷,在1,2,3,2k中,每次找到第m個數,判斷如果是大於k的,那麼...
poj2746約瑟夫問題
2746 約瑟夫問題 檢視 提交 統計 提示 提問 總時間限制 1000ms 記憶體限制 65536kb 描述約瑟夫問題 有 只猴子,按順時針方向圍成一圈選大王 編號從 到 從第 號開始報數,一直數到 數到 的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是...