孩子們的遊戲(圓圈中最後剩下的數)

2022-08-04 09:24:09 字數 1421 閱讀 9247

時間限制: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的那個小朋友要出列唱首歌,然後可以在...