【luoguP1996】【luogu-original】约瑟夫问题
先来看题目:
题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入输出格式
输入格式:n m输出格式:出圈的编号
输入输出样例
说明
m<=100,n<=100
说实话,这个题就是一个非常水的模拟题,首先我们可以不按照题目来说的一个一个的去人,我们将已经出队的人做一个标记,再次循环的时候不经过他就可以了。我们bool一个visit用来标记已经出了队的人,防止重复统计,然后两个循环解决问题。
下面附上代码:
#include<cstdio> using namespace std; int main() { int n,m,s=0;scanf("%d%d",&n,&m);//读入 bool visit[200]={0};//visit赋初始值全为0 for(int k=0;k<n;k++)总共要出队n次所以循环n次 { for(int i=0;i<m;i++) { if(++s>n)s=1; if(visit[s])i--; }//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环 printf("%d ",s); visit[s]=true;//输出,将已经出队的人标记为1防止重复 } return 0; }