有 n 个小朋友做游戏,他们的编号分别是 1,2,3...n。他们按照编号从小到大依次顺时针围成一个圆圈,从第一个小朋友开始从 1 报数,依次按照顺时针方向报数(加一),报 m 的人会离开队伍,然后下一个小朋友会继续从 1 开始报数,直到只剩一个小朋友为止。 第一行输入两个整数,n,m。(1≤n,m≤1000) 输出最后一个小朋友的编号,占一行。
时间: 2024-03-17 19:44:12 浏览: 83
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
这是一个经典的约瑟夫问题,可以用递推或者数学公式求解。下面给出递推的解法。
思路:
首先,我们可以用一个布尔数组来表示每个小朋友是否还在队伍中,初始时所有小朋友都在队伍中。然后,我们从第一个小朋友开始报数,每次报数时,如果这个小朋友还在队伍中,就记录下来,直到数到 m 为止。然后,把记录下来的小朋友标记为不在队伍中,接着从下一个小朋友开始报数,重复上述过程,直到只剩下一个小朋友为止。
代码实现:
```python
n, m = map(int, input().split())
# 初始化布尔数组,表示所有小朋友都在队伍中
in_queue = [True] * n
# 记录当前报数的小朋友的编号
cur = 0
# 记录还剩下多少小朋友在队伍中
count = n
while count > 1:
# 记录当前报数的小朋友报的数
num = 0
# 找到下一个还在队伍中的小朋友
while num < m:
if in_queue[cur]:
num += 1
if num == m:
# 报数为 m,记录下这个小朋友的编号
in_queue[cur] = False
count -= 1
break
cur = (cur + 1) % n
# 找到下一个还在队伍中的小朋友
while not in_queue[cur]:
cur = (cur + 1) % n
# 找到最后一个还在队伍中的小朋友
for i in range(n):
if in_queue[i]:
print(i + 1)
break
```
时间复杂度为 $O(nm)$,空间复杂度为 $O(n)$。
阅读全文