約瑟夫問題的題目和描述就不說了,題目鏈結有很多,我直接瞎選了乙個,自己看看就可以:
點這裡,原版題目,自己試試看
洛谷的題
首先說思路,每一輪都會有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,第...