思路:環形鍊錶,可以用,也可以用單鏈表,只要將彈出的再加入單鏈表的尾部即可,詳看**。
資源限制
時間限制:1.0s 記憶體限制:256.0mb
問題描述
學校給高一(三)班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?
班長想出了乙個辦法,讓班上的所有同學(共有n個同學)圍成一圈,按照順時針方向進行編號。
然後隨便選定乙個數m,並且從1號同學開始按照順時針方向依次報數,1,2
, …, m,凡報到m的同學,都要主動退出圈子。
然後不停地按順時針方向逐一讓報出m者出圈,最後剩下的那個人就是去參加開幕式的人。
要求:用環形鍊錶的方法來求解。所謂環形鍊錶,即對於鍊錶尾結點,其next指標又指向了鍊錶的首結點。基本思路是先建立乙個環形鍊錶,模擬眾同學圍成一圈的情形。然後進入迴圈淘汰環節,模擬從1到m報數,每次讓一位同學(結點)退出圈子。
輸入格式:輸入只有一行,包括兩個整數n和m,其中n和 m的含義如上所述。
輸出格式:輸出只有乙個整數,即參加開幕式的那個人的編號。
輸入輸出樣例
樣例輸入83
樣例輸出
7
**:
class
linkedqueue
:class
_node
: __slots__ =
'_element'
,'_next'
def__init__
(self,element,
next):
self._element = element
self._next =
next
def__init__
(self)
: self._head =
none
self._tail =
none
self._size =
0def
size
(self)
:# 鍊錶的大小
return self._size
defisempty
(self)
:# 鍊錶是否為空
return self._size ==
0def
top(self)
:# 鍊錶頭部的值
if self._size ==0:
return
'error'
return self._head._element
defenqueue
(self,e)
:# 存入鍊錶
newest = self._node(e,
none
)if self._size ==0:
self._head = newest
else
: self._tail._next = newest
self._tail = newest
self._size +=
1def
dequeue
(self)
:# 鍊錶出
if self._size ==0:
return
'error'
temp = self._head._element
self._head = self._head._next
self._size -=
1if self._size ==0:
self._tail =
none
return temp
deffun
(n,m)
: s = linkedqueue(
)# 例項化
for i in
range(1
,n+1):
s.enqueue(i)
# 存入鍊錶
while s.size(
)>1:
# 每次迴圈將第m個數彈出,其餘數存入鍊錶尾部
for i in
range(1
,m):
s.enqueue(s.dequeue())
s.dequeue(
)return s.dequeue(
)if __name__ ==
"__main__"
: n,m =
map(
int,
input()
.split())
# n 總人數; 報到 m 的出局
print
(fun(n,m)
)
藍橋杯 演算法提高 奧運會開幕式
問題描述 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學 圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1號同學開始按照順時針方向依次報數,1,2,m,凡報到m的同學,都要主動退出...
藍橋杯 C 奧運會開幕式
題目閱覽 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學 圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1號同學開始按照順時針方向依次報數,1,2,m,凡報到m的同學,都要主動退出...
藍橋杯 ADV 296 演算法提高 奧運會開幕式
演算法提高 奧運會開幕式 時間限制 1.0s 記憶體限制 256.0mb 問題描述 學校給高一 三 班分配了乙個名額,去參加奧運會的開幕式。每個人都爭著要去,可是名額只有乙個,怎麼辦?班長想出了乙個辦法,讓班上的所有同學 共有n個同學 圍成一圈,按照順時針方向進行編號。然後隨便選定乙個數m,並且從1...