1334:【例2-3】围圈报数

时间:2022-11-20 04:50:33

1334:【例2-3】围圈报数


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 2253     通过数: 1482 

【题目描述】

n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为12n1,2,…,n,打印出列的顺序。

【输入】

nn和mm。

【输出】

出列的顺序。

【输入样例】

4 17

【输出样例】

1 3 4 2

【提示】

n100n≤100。

【来源】


一本通

解析:

若是使用链表,这题的复杂程度无疑大大上升了,其实,我们完全用不着那么麻烦,一个个地报数,可以想象成一个队列,一个人报完数后,判断他所报的数是不是出局的数,如果是,直接弹出,但若不是,将其移动至队尾即可。

我们使用一个队列q进行模拟,在读取总人数和出局数字后,把这些人一个个地压入队列尾部。在使用队列之前,需要先加上头文件queue。


1
#include<cstdio> 2 #include<iostream> 3 #include<queue> 4 using namespace std; 5 queue<int>q; 6 int i,j,k; 7 int n,m,now=1; 8 using namespace std; 9 int main() 10 { 11 scanf("%d%d",&n,&m); //读取数据 12 for(i=1;i<=n;i++) //初始化队列 13 q.push(i); 14 while(!q.empty()) //在队列不为空时继续模拟 15 { 16 if(now==m) 17 { 18 printf("%d ",q.front() ); //打印出局的人的编号 19 q.pop(); //出局 20 now=1; //初始化现在的数字 21 } 22 else 23 { 24 now++; 25 q.push(q.front()); //排至队尾 26 q.pop();; 27 } 28 } 29 return 0; 30 }

推荐相似题:

P1996 约瑟夫问题

如果还有兴趣,请体验:

围圈报数(增强版)