#12051. Counting Out Game / 报数问题

Counting Out Game / 报数问题

Problem J47: Counting Out Game / 报数问题

版权信息: · 经典环形模拟(约瑟夫问题)


任务总览

任务名称 时间限制 内存限制 分数
报数问题 1 sec 1024 MB 10 points

题目描述

NN 个小孩围成一个圈,从 11 开始依次编号。

现在规定:

  • 从第 WW 个小孩开始报数;
  • 报到第 SS 个数时,该小孩出列;
  • 然后从下一个 小孩继续报数,依旧从 11 报到 SS
  • 重复该过程,直到所有小孩都出列。

请你输出小孩出列的顺序。


输入格式

*第一行一个整数 NN1N641 \leq N \leq 64),表示小孩数量;

  • 接下来的 NN 行,每行一个字符串,表示一个小孩的名字(长度不超过 15 个字符);
  • 最后一行输入两个整数 WWSS,表示从第 WW 个小孩开始报数,每轮报到 SS,中间用英文逗号 , 隔开。

输出格式

*输出 NN 行,每行一个小孩的名字,按照其出列的顺序排列。


输入输出样例

输入示例

5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2, 3

输出示例

Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi

题目分析与解法

✅ 解法思路(约瑟夫环问题):

  • 使用一个循环队列(如 vectorlist)模拟小孩的环形站位;
  • 从编号为 W1W - 1 的小孩开始报数;
  • 每次报到第 SS 个小孩将其移出,并记录出列顺序;
  • 然后从其下一个小孩继续报数,循环进行,直到所有人都出列。

边界细节说明

*报数应为循环计数,超过当前人数时从头开始;

  • 输入保证 W<NW < N

    • 名字可重复,程序以顺序为准,不考虑重名处理。

时间复杂度分析

操作 复杂度
报数循环一次 O(S)O(S)
总出列处理 O(NS)O(N \cdot S)(最坏情况)