约瑟夫问题 洛谷 - P1996
Description
n个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰n−1 名小朋友,而该题是全部出圈。
Input
输入两个整数 n,m。
Output
输出一行 n
个整数,按顺序输出每个出圈人的编号。
Sample 1
Input
10 3
Output
3 6 9 2 7 1 8 5 10 4
Hint
1≤m,n≤100
使用的函数
函数名称 | 用处 | 用法 |
---|---|---|
deque | 双向队列,两端操作 | 定义dqeue<类型名> |
push_back | 从末尾插入队列 | 队列名.push_back(插入的值) |
pop_front | 删除队列末尾的数 | 队列名.pop_front() |
front | 取队列头 | 队列名.front() |
size() | 队列长度 | 队列名.size() |
Code
#include <stdio.h>
#include <deque>using namespace std;deque<int> d1;
int n, m;
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) d1.push_back(i);while (d1.size()){int t=m-1;while (t--) d1.push_back(d1.front()), d1.pop_front();printf("%d ", d1.front());d1.pop_front();}return 0;
}