0, 1, …, n - 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。
每組資料一行,包含2個整數n和m,分別表示0 到 n - 1 的序列和指定刪除的第m個數字。
輸出能保留到最後的那個數字。
5 3除了暴力破解其實還有一種方法就是找到n個數字和n-1個數字的之間的關係,利用動態規劃的思想來解決 1)對於n個數組成的序列,第一次被刪除的數為:(m - 1) % n。
(2)假設第二輪刪除時,初始數字為m % n。令k = m % n,則對於剩下的n - 1個數構成的約瑟夫環為:k, k + 1, k + 2, k +3, …..,k - 3, k - 2。做乙個對映如下:
k ——> 0
k+1 ——> 1
k+2 ——> 2……
k-2 ——> n-2
也就是說,n - 1個數中的乙個數k,對應n個數時的下標為0。因此,設n - 1個序列最終留到最後的數為x,利用對映關係逆推,可得出n個數時,留到最後的數為:(x + k) % n。則有:
(x + k) % n
= (x + (m % n)) % n
= (x % n + (m % n) % n) % n
= (x % n + m % n) % n
= (x + m) % n
(3)類似的,現在考慮第二個被刪除的數:(m - 1) % (n - 1)。
(4)假設第三輪的開始數字為p,那麼這n - 2個數構成的約瑟夫環為p, p + 1, p + 2,…, p - 3, p - 2。同樣得到如下對映:
p ——> 0
p+1 ——> 1
p+2 ——> 2……
p-2 ——> n-3
也就是說,n - 2個數中的乙個數p,對應n - 1個數時的下標為0。設n - 2個序列最終留到最後的數為y,利用對映關係逆推,可得出n - 1個數時,留到最後的數為:(y + p) % (n - 1),其中p等於m % (n - 1)。代入可得:(y + m) % (n - 1)。
由以上內容得知,要求得n個數的序列最後留下的值,可通過n - 1個數的解來求得。遞推下去,當只有乙個人時,最後乙個數字是0。
//n是代表n個數字,m是第每個出隊
public static int getjosephus(int n,int m)
for(int i = 2;i <= n;i++)
return all;
}
面試題 約瑟夫環問題
題目 0,1,n 1這n個數字拍成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡身下的最後乙個數字。規律法 class solution return pre 鍊錶模擬法 class solution list int iterator next cur 賦值的時候先自加,再...
經典面試題
1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...
經典面試題
我的老同學現在富得流油。他開創了乙個軟體公司,開發了一系列軟體,生意越做越大。今天他來到這個城市後馬上打 給我。是我啊!聽出來了嗎?是這樣的,我到這兒的大學招畢業生,要在這兒呆上五天,咱哥們趁這個時間好好聚一聚。我做東!既然他要做東,我理所當然順水推舟。人家是老闆,不吃白不吃!我來到他下榻的賓館,看...