P1996 约瑟夫问题
(什么?!要给学弟学妹讲约瑟夫问题?!难道就不怕我给他们讲错了吗?! 啊啊啊,为了不给学弟学妹们讲错,蒟蒻表示要临阵磨一下刀、、、)
题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入输出格式
输入格式:
n m
输出格式:
出圈的编号
输入输出样例
输入样例#1:
10 3
输出样例#1:
3 6 9 2 7 1 8 5 10 4
说明
m, n \le 100m,n≤100
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 30005 using namespace std; int n,m; bool vis[N]; int read() { ,f=; char ch=getchar(); ;ch=getchar();} +ch-',ch=getchar(); return x*f; } int work() { ,j=; while(sum<n) { ;i<=n&&sum<n;i++) { if(vis[i]) continue; j++; if(j==m) { vis[i]=true; printf("%d ",i); sum++;j=; } } } } int main() { n=read(),m=read(); work(); ; }
法一
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 30005 using namespace std; int n,m,a[N]; int read() { ,f=; char ch=getchar(); ;ch=getchar();} +ch-',ch=getchar(); return x*f; } int work() { ;i<n;i++) a[i]=i+; a[n]=;,now=n,sum=; while(sum<n) { while(k<m) { k++; now=a[now]; } printf("%d ",a[now]); sum++;//sum表示的是出队的人的个数 a[now]=a[a[now]];k=; } } int main() { n=read(),m=read(); work(); ; }
法二
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 30005 using namespace std; int n,m,a[N]; bool vis[N]; int read() { ,f=; char ch=getchar(); ;ch=getchar();} +ch-',ch=getchar(); return x*f; } int work() { ; ;i<=n;i++) a[i]=i; while(n) { now=(now+m-)%n; ) now=n; printf("%d ",a[now]); ]; n--; } } int main() { n=read(),m=read(); work(); ; }
法三