2339. 排队问题
1000ms
256MB
简单
队列
题目描述
有 $n$ 个人排队,每个人有一个唯一编号。所有人从左往右进行 `1, 2, 1, 2, ...` 循环报数。
- 报到 `1` 的人出队。
- 报到 `2` 的人立即站到队伍的最右端(队尾)。
- 报数过程反复进行,直到所有人出列为止。
已知 $n$ 个人原来的排队顺序,请写出他们的出列顺序。
输入格式
- 第一行为一个正整数 $n$ ($n \le 100$)。
- 第二行为 $n$ 个互不重复的正整数,表示他们初始排队时的编号 $i$ ($1 \le i \le n$)。
输出格式
- 输出一行,为他们出列的编号序列,数字之间用一个空格隔开。
样例 1
输入 (Input)
8 1 2 3 4 5 6 7 8
输出 (Output)
1 3 5 7 2 6 4 8
样例 2
输入 (Input)
4 2 5 1 3
输出 (Output)
2 1 5 3
样例说明
- 对于所有数据:$n \le 100$,编号在 $1 \sim 1000$ 范围内且不重复。
- **样例 2 说明**:
初始队列:`[2, 5, 1, 3]`
1. 队首 `2` 报数 1:出队,输出 `2`。当前队列:`[5, 1, 3]`
2. 队首 `5` 报数 2:移到队尾。当前队列:`[1, 3, 5]`
3. 队首 `1` 报数 1:出队,输出 `1`。当前队列:`[3, 5]`
4. 队首 `3` 报数 2:移到队尾。当前队列:`[5, 3]`
5. 队首 `5` 报数 1:出队,输出 `5`。当前队列:`[3]`
6. 队首 `3` 报数 2:移到队尾。当前队列:`[3]`
7. 队首 `3` 报数 1:出队,输出 `3`。队列空。
最终输出:`2 1 5 3`。
- **算法提示**:
这是一个典型的**队列模拟**问题。
可以使用 `std::queue` 存储排队编号。用一个布尔变量 `is_one` 记录当前应该报 1 还是 2(每次操作后取反):
- 当 `is_one` 为 `true` 时,弹出队首并输出。
- 当 `is_one` 为 `false` 时,弹出队首并重新将其压入队尾。
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout
错误 stderr
操作成功