题解:P1996 约瑟夫问题

· · 题解

题解:P1996 约瑟夫问题

题意

## 分析 本题我们可以用 STL 中的队列解决。队列是一种先进先出的数据结构,从最后面的队尾插入,从最前面的队首弹出。 可以先将 $1$ 到 $n$ 插入队列,如果队列里还有元素,就弹出队首元素。如果判断到这时正好报到 $m$,直接输出编号,否则再将它插入队列。因为每循环 $m$ 次才能使一个人出圈,所以使 $n$ 个人全部出圈,时间复杂度就是 $O(nm)$。 ## 代码 ```cpp #include <iostream> #include <queue> // 使用 queue 需要写头文件 using namespace std; int main() { int n, m; cin >> n >> m; // 输入 queue <int> q; // 定义队列 for (int i = 1; i <= n; ++i) { q.push(i); // 依次插入每一个人的编号 } int num = 0; while (!q.empty()) // 如果队列里还有元素就一直循环 { num += 1; // 当前的人报的数 int a = q.front(); // 存储队首元素 q.pop(); // 弹出队首元素 if (num == m) // 如果报到 m { num = 0; // 重新开始报数 cout << a << " "; // 输出编号 continue; // 重新开始循环 } q.push(a); // 否则再次插入编号 } return 0; // 完结撒花! } ``` :::success[你可以] 点个赞再走吧! ::: :::warning[注意] 不要复制题解,会棕名的! :::