「LGOJ」约瑟夫问题

题目描述

$n$ 个人围成一圈,从第一个人开始报数,数到 $m$ 的人出列,再由下一个人重新从$1$开始报数,数到 $m$ 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

题解

这道题可以用队列做啊qwq,我们先把所有人扔进队列

用一个变量 $num$ 统计一下

如果刚好数到这个人,那我们就输出

否则的话我们把这个人扔到队头

具体看注释和代码(扔这个词貌似有点

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
using namespace std;

int n,m,num=0;

int main(){
cin>>n>>m;
if(n==0)return 0;
if(m==0)return 0;
int head,tail,h[10000];
head=1;tail=n;//注意初始化
for(int i=1;i<=n;i++){
h[i]=i;//把所有人先扔进队列
}
//for(int i=1;i<=n;i++)cout<<h[i]<<" ";
while(head!=tail){
num++;
if(num>=m){//刚好数到m
cout<<h[head]<<" ";
head++;
num=0;
}else{//扔到队头qwq
tail++;
h[tail]=h[head];
head++;
}
}
cout<<h[head]; //别漏了最后有个人呢qwq
return 0;
}
0%