本來是要昨天來寫這學習**的,然後昨晚寢室又斷電了,忍不住在這裡吐槽一下,嗯,寢室天天斷電。
題意就是輸入n,k,m三個數,n個數排成乙個圈,第一次刪除m,以後每數k個數刪除一次,求最後乙個被刪除的數。
言歸正傳,以前寫過乙個鍊錶的約瑟夫問題,但是在這裡肯定是會超時的。後來看了些參考,終於明白了怎麼做。
把n個數從0陣列開始存入,第一次刪除第m個數後,也就是陣列下標為m-1的數被刪去,此時把陣列下標為m的數重新作為0號位置,重新組成乙個環,那麼此時下標為m的數的下標變為了0。
接下來就是逆推導的過程,x『=(x+m)%n 。
用陣列記錄勝利者所在的位置,a[1]表示剩有乙個人時勝利者所在的位置,a[2]就是剩有兩個人時勝利者所在的位置,由上面可知,a[1]=0。
以後的每一次刪除就是重複上一次的過程,最後留下的人一定處於0號位置,那麼可以一直遞推上去求出勝利者一開始所在的位置。
1 #include2 #include3using
namespace
std;45
const
int maxn = 10005;6
inta[maxn];78
intmain()919
return0;
20 }
數學小技巧 UVA 1394 約瑟夫環
約瑟夫環問題 詳解 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依 此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 ...
約瑟夫問題及其變形
問題 n個數排乙個圈,從編號1開始刪除,以後每m個數刪一次,問最後乙個被刪除的數。2 n 10000,1 k 10000 includeusing namespace std int main return 0 變形 從第k個數開始刪。includeusing namespace std defin...
約瑟夫問題與變形
1.約瑟夫問題 n個人編號為0.n 1.圍成乙個圈。從編號為0的人開始順時針計數,每數到k個人時讓其出局 第一次出局的是編號為 k 1 mod n的人 接著又從下乙個人開始計數。經過n 1輪報數後,求最終留下的人的編號。我們只關心最後乙個留下的人,比如,當刪除第乙個人後,也就是刪除編號為 k 1 m...