Oiclass P2261 题解

这道题实际上很简单

先看题目,会发现,这道题似乎很想模拟题,但是又好像不是,因为用正常的方法没法模拟,或者说很难模拟。看标签仔细观察就可以知道,这是一道数据结构相关的模版题,具体会用到队列。

思路如下:

  • 首先输入题目中提到的 \(n\)\(c\)
  • 在队列中压入 \(1 \to n\) 的所有自然数,对于 \(n = 6\) 的情况,队列应该是这样的:\(队头\ 1,2,3,4,5,6\ 队尾\)
  • 进行一个 while 循环,循环的条件是 !q.empty() //q 是一个队列 在循环中,如果这个报数报到 \(c\) 了,那么就输出当前的这个数(即队头),如果还没有报到,那么就将现在的队头扔到队尾(q.push(q.front()); q.pop();),方便后面输出。

实现:

实现其实非常简单,只需要创建一个队列,按照思路的前两步做,对于第三步,我们需要创建一个临时变量 \(p\) ,如果 \(p=c\) 那么输出,同时将 \(p\) 赋值为 \(1\) ,如果不符合条件(\(!(p=c)\)),那么就 \(p =p+1\) . 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <queue>

using namespace std;

int n, c;
queue<int> q;

int main() {
cin >> n >> c;
for (int i = 1; i <= n; i++) {
q.push(i);
}
int p = 1;
while (!q.empty()) {
if (p == c) {
cout << q.front() << " ";
p = 1;
q.pop();
} else {
q.push(q.front());
q.pop();
p += 1;
}

}
}

Oiclass P2261 题解
https://lixuannan.github.io/posts/c0f28fe
作者
CodingCow Lee
发布于
2023年2月1日
许可协议