猴群選猴王(約瑟夫問題)詳解

2021-10-22 06:39:24 字數 865 閱讀 8863

約瑟夫問題的題目和描述就不說了,題目鏈結有很多,我直接瞎選了乙個,自己看看就可以:

點這裡,原版題目,自己試試看

洛谷的題

首先說思路,每一輪都會有1個人退出,在這裡我們會關心誰退出了,誰留下來。

第一輪:第m%n個人退出

第二輪:第2m%n個人退出··

··第n-1輪:第(nm-m)%n個人退出

此時還剩下乙個人,他就是勝者

所以這個問題用乙個迴圈就可以搞定

#include

int n,m;

intmain()

printf

("%d"

,ans+1)

;}

再優化:

本題的 k 特別小,只≤ 1000,這就是這題的題眼了。

假如像上面一樣列舉 i的話,發現 i 大起來之後,很多時候 ans+k 之後依然小於 i,也就是說,此時對 i 取模跟沒取模的值是相同的,就是不需要進行取模,也就是說,每次可以直接加若干個 k,然後再對此時的 i 進行取模。

那麼怎麼知道每次要加多少個 k 呢?追擊:

ans 每次加 k ,i 每次加 1,問多少次之後 a n s ≥ i 。

#include

#include

#include

typedef ll long

long

ll n,k;

intmain()

printf

("%lld"

,ans+1)

;//別忘了+1

}//**誤抄

//**誤抄

選猴王(約瑟夫問題)

一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?整體思路 建立頭尾相連的鍊錶,將...

選猴王問題

一群猴子有50只,坐在一起選猴王,每只猴子都有乙個編號1 50。從1號猴子開始報號,報到7號則退出 下只猴子繼續從1開始報,依次迴圈,則最後的乙隻猴子為猴王。試求出這只猴子的編號。include includetypedef int elemtype typedef struct lnode lis...

約瑟夫問題(關於小猴)

約瑟夫問題 有n只猴子,按順時針方向圍成一圈選大王 編號從1到n 從第1號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入n,m後,輸出最後猴王的編號。input 每行是用空格分開的兩個整數,第乙個是 n,第...