首页 > 试题广场 >

约瑟夫环

[编程题]约瑟夫环
  • 热度指数:17977 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}n 个人(编号 0\sim n-1)围成一圈,从编号为 k 的人开始报数,报数依次为 1,2,\dots,m,报到 m 的人出队。下次从出队者的下一个人开始重新报数,循环往复,直到队伍中只剩最后一个人,该人即"大王"。

\hspace{15pt}给定三个正整数 n,k,m,请输出最后剩下的"大王"编号。

输入描述:
\hspace{15pt}在一行中输入三个整数 n\left(2 \leqq n \leqq 100 \right),k\left(0 \leqq k \leqq n-1\right),m\left(1 \leqq m \leqq 100\right),用空格隔开。


输出描述:
\hspace{15pt}输出一个整数,表示最后剩下的"大王"编号。
示例1

输入

5 1 2

输出

3

说明

初始队列编号为 [0,1,2,3,4],从编号 1 开始报数:

\hspace{8pt}1(1),2(2)\to 2 出队,剩余 [0,1,3,4]

\hspace{8pt}3(1),4(2)\to 4 出队,剩余 [0,1,3]

\hspace{8pt}0(1),1(2)\to 1 出队,剩余 [0,3]

\hspace{8pt}3(1),0(2)\to 0 出队,剩余 [3],输出 3
n,k,m=map(int,input().split())
l=list(range(n))
while n>=2:
    k=(k+m-1)%n
    l.pop(k)
    n-=1
print(*l)

发表于 2025-11-04 14:52:11 回复(0)
import sys

for line in sys.stdin:
    n, k, m = map(int, line.strip().split())
    lst = list(range(n))
    for _ in range(n - 1):
        k = (k+m-1)%len(lst)
        lst.pop(k)
    print(lst[0])

发表于 2025-10-29 09:59:27 回复(0)
n,k,m=map(int,input().split())
L=list(range(n))
p=k
while len(L)>1:
    p=(p+m-1)%len(L)
    L.pop(p)
print(L[0])
发表于 2025-09-26 10:51:23 回复(0)
n,k,m=map(int,input().split())
lst=list(range(n))
start=k
while len(lst) > 1:
    for _ in range(m-1):
        start = (start + 1) % len(lst)
    removed_person = lst.pop(start)
print(lst[0])
   
发表于 2025-07-30 15:40:51 回复(0)
n, k, m = map(int, input().split())

l = list(range(n))
i = k

while len(l) > 1:
    i = (i + m-1) % len(l)
    l.pop(i)

print(*l)
发表于 2025-07-15 13:16:51 回复(0)