藍橋杯 C 奧運會開幕式

2021-10-08 21:23:34 字數 1672 閱讀 2229

題目閱覽

學校給高一(三)班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學(共有n個同學)圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1號同學開始按照順時針方向依次報數,1, 2, …, m,凡報到m的同學,都要主動退出圈子。然後不停地按順時針方向逐一讓報出m者出圈,最後剩下的那個人就是去參加開幕式的人。

要求:用環形鍊錶的方法來求解。所謂環形鍊錶,即對於鍊錶尾結點,其next指標又指向了鍊錶的首結點。基本思路是先建立乙個環形鍊錶,模擬眾同學圍成一圈的情形。然後進入迴圈淘汰環節,模擬從1到m報數,每次讓一位同學(結點)退出圈子。

輸入格式:輸入只有一行,包括兩個整數n和m,其中n和 m的含義如上所述。

輸出格式:輸出只有乙個整數,即參加開幕式的那個人的編號。

樣例輸入1

8 3樣例輸出1

7思路簡介

這道題首先我們了解到是類似於約瑟夫環的問題,然後根據使用者輸入的人數組成圈圈,給出的m值為篩選條件,依次去除掉報到m值的學生,直到只剩下乙個人時結束迴圈,得到參加奧運會開幕的幸運者。

在此使用c++裡面的stl庫中的list完成這整個過程,list採用的資料結構是環狀雙向鍊錶,相對於vector來說,list對於插入資料,刪除資料的效率很高,並且迭代器不會輕易失效。

具體思想:首先將所有學生初始代號存入list列表中,然後以每乙個同學編號為基礎,使用臨時變數count記錄學生報數值,若是滿足m,則將其從列表中刪除,否則保留,依次迴圈,完成最後只剩下一位幸運者,迴圈結束。

奧運會開幕式實現**

#include #include #include using namespace std;

int main()

cout<程式執行步驟圖示

此處以樣例的輸入和輸出為例,進行下面演算法步驟:

執行截圖

鍊錶實現

由於上述使用的是stl自帶的list完成的程式,在此記錄一下這位博主的c語言自定義鍊錶實現**:自定義鍊錶實現

**如下:

#include

#include

*/typedef

struct stustu;

void create (stu* head,

int n)

//若頭結點不為空的連線情況

else}}

int choose (stu* head,

int m)

//若為其他自然數,則就進行依次迴圈篩選,

else

else

}//返回最後的結果

return s->num;}}

intmain

(int argc,

char

*ar**)

藍橋杯 演算法提高 奧運會開幕式

問題描述 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學 圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1號同學開始按照順時針方向依次報數,1,2,m,凡報到m的同學,都要主動退出...

藍橋杯 ADV 296 演算法提高 奧運會開幕式

演算法提高 奧運會開幕式 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學 圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1...

試題 演算法提高 奧運會開幕式

思路 環形鍊錶,可以用,也可以用單鏈表,只要將彈出的再加入單鏈表的尾部即可,詳看 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學...