時間限制:c/c++ 1秒,其他語言2秒 空間限制:c/c++ 32m,其他語言64m題目描述
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的:首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,從他的下乙個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最後乙個小朋友,可以不用表演,並且拿到牛客名貴的「名偵探柯南」典藏版(名額有限哦!!_)。請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)思路:如果沒有小朋友,請返回-1
根據題目描述,這就是乙個約瑟夫環的問題。定義乙個關於m 和n的方程,f(n,m),表示n個數字0,1,2,….n-1;
中每次刪除第m個數字最後剩下的數字。
第乙個被刪除的數字(m-1)%n.
例如0,1,2,3,4,5,刪除第3個,即2,那麼(3-1)%6=0….2,商0餘2,所以2就是那個被刪除的數。
在刪除第m個數字(定義為k)之後的序列為
0,1,2,…k-1,k+1,…n-1;
在進入下一次迴圈時刪除第m個的時候從第k+1個數開始,這個序列為k+1,,,n-1,0,1,…k-1;函式因此定為f(n-1,m)
再將這個對映我從0開始的序列,如下:
k+1 → 0;
k+2 → 1;
…n-1 → n-1-(k+1)=n-k-2;
0 → n-k-2+1=n-k-1;
1 → n-k;
…k-1 → n-k-1+(k-1)=n-2;
對映p(x)=p(x-k-1)%n;表示對映錢的數字是x,對映後的數字是x-k-1。逆對映為
p(x)=(x+k+1)%n.
這裡記住無論迴圈多少次刪除第m個元素最後剩下的數字是一樣的。
有f*(n-1,m)=p*( f(n-1,m))=( f(n-1,m)+k+1)%n.=(f(n-1,m)+m)%n.
因為k=(m-1)%n=(m-1)
class solution
};
另一種方法採用陣列來模擬環的效果,依次尋找第m個數,其中要涉及對要刪除元素值的改變,以及注意開始遍歷元素下標的處理
class solution
}return i;
}};
孩子們的遊戲 圓圈中最後剩下的數
六一兒童節快要到了,牛妹為小夥伴們準備了乙個小遊戲,學會了可以將一堆小盆友馴 調 服 教 成功噢 第一步 你需要準備一堆小禮品,其中乙份一定是所有小盆友都喜歡的,這個你懂噠 第二步 讓小盆友們圍成乙個大圈,你隨機指定乙個數m,讓編號為0的小盆友開始報數 第三步 規定每次喊到m的那個小朋友要出列唱首歌...
孩子們的遊戲 圓圈中最後剩下的數
六一兒童節快要到了,牛妹為小夥伴們準備了乙個小遊戲,學會了可以將一堆小盆友馴 調 服 教 成功噢 第一步 你需要準備一堆小禮品,其中乙份一定是所有小盆友都喜歡的,這個你懂噠 第二步 讓小盆友們圍成乙個大圈,你隨機指定乙個數m,讓編號為0的小盆友開始報數 第三步 規定每次喊到m的那個小朋友要出列唱首歌...
孩子們的遊戲 圓圈中最後剩下的數
每年六一兒童節,nowcoder都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為nowcoder的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m的那個小朋友要出列唱首歌,然後可以在...