1334:【例2-3】围圈报数时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】有nn个人依次围成一圈,从第11个人开始报数,数到第mm个人出列,然后从出列的下一个人开始报数,数到第mm个人又出列,…,如此反复到所有的人全部出列为止。设nn个人的编号分别为1,2,…,n1,2,…,n,打印出列的顺序。 【输入】nn和mm。 【输出】出列的顺序。 【输入样例】4 17 【输出样例】1 3 4 2 【提示】n≤100n≤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 约瑟夫问题
原文地址:https://www.cnblogs.com/fuxiqi/p/10836856.html
时间: 2024-10-14 06:27:06