输入样例:
10 3
输出样例:
3 6 9 2 7 1 8 5 10 4
思路:由于数据量很小,所以可以直接模拟。
(1)数组模拟,将数到 m 的标记为出圈并输出,下一个重新数,每个人都数了一遍又重头数。
(2)队列模拟,先全部入队,然后依次出队,数到m的输出,重新数数,没数到 m 的重新入队尾。
AC代码1(数组模拟):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int vis[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int ind=0,sum=0,num=0;
while(sum<n)
{
ind++;
if(!vis[ind])//没出圈
{
num++;//数数
if(num==m)//数到 m
{
num=0;//下一个重新数
sum++;//出圈人数
vis[ind]=1;//标记已出圈
printf("%d ",ind);
}
}
if(ind==n)//每个人都数了一次,重新头开始
ind=0;
}
return 0;
}
AC代码2(队列模拟):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int vis[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
queue<int> q;
for(int i=1;i<=n;i++)//围成圈
q.push(i);
int num=0;
while(!q.empty())
{
int t=q.front();q.pop();
num++;
if(num==m)//数到 m
{
num=0;//下一个重新数
printf("%d ",t);
}
else//没数到 m,入队尾
q.push(t);
}
return 0;
}