题目传送门
题目大意:
n个人围成一圈,编号分别为1到n,从第一个人开始报数,报到m的人就被击毙,下一个人继续从一开始报数。一直重复,知道所有人都被击毙。按顺序输出被击毙的人的编号。
思路:
用队列,用一个变量kill表示报到几,如果报到m就出队,如果没有报到m就把这个数放到最后,每次kill++。
代码:
#include<iostream>
#include<deque>
using namespace std;
deque<int>q;
int main(){
int n,m;
cin>>n>>m;
//kill初始化
int kill=1;
//把每个数进行编号
for(int i=1;i<=n;i++){
q.push_back(i);
}while(!q.empty()){
//如果报到m
if(kill==m){
//输出
cout<<q.front()<<" ";
//击毙
q.pop_front();
//下一个人从一开始报,但是每循环一次kill都会加一,所以这里kill=0
kill=0;
}//没有报到m
else{
//把它放到队尾
q.push_back(q.front());
//把它从队首弹出
q.pop_front();
}//kill每次加一
kill++;
}//完结撒花
return 0;
}