P1996||T1282 约瑟夫问题 洛谷||codevs

https://www.luogu.org/problem/show?pid=1996||http://codevs.cn/problem/1282/

题目背景

约瑟夫是一个无聊的人!!!

题目描述

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

输入输出格式

输入格式:

 

n m

 

输出格式:

 

出圈的编号

 

输入输出样例

输入样例#1:
10 3
输出样例#1:
3 6 9 2 7 1 8 5 10 4

说明

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #define N 30005
 5 
 6 using namespace std;
 7 
 8 int n,m,sum,k,now;
 9 int que[N];
10 bool vis[N];
11 
12 int main()
13 {
14     cin>>n>>m;
15     while(sum<n)
16     {
17         k++;
18         now++;
19         if(now==n+1) now=1;
20         if(vis[now])
21             while(vis[now])
22             {
23                 now++;
24                 if(now==n+1)
25                     now=1; 
26             }
27         if(k==m)
28         {
29             k=0;
30             printf("%d ",now);
31             vis[now]=1;
32             sum++;
33         }
34     }
35     return 0;
36 }
View Code
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #define N 30005
 5 
 6 using namespace std;
 7 
 8 int n,m,k,sum,now;
 9 int que[N];
10 
11 int main()
12 {
13     cin>>n>>m;
14     for(int i=1;i<n;i++)
15         que[i]=i+1;
16     que[n]=1;
17     k=1; now=n;
18     while(sum<n)
19     {
20         while(k<m)
21         {
22             k++;
23             now=que[now];
24         }
25         printf("%d ",que[now]);
26         sum++;
27         que[now]=que[que[now]];
28         k=1;
29     }
30     return 0;
31 }
View Code 2
 1 #include <cstdio>
 2 
 3 using namespace std;
 4 
 5 int n,m,q[30005],now=1;
 6 
 7 int main()
 8 {
 9     scanf("%d%d",&n,&m);
10     for(int i=1;i<=n;i++)    q[i]=i;
11     while(n)
12     {
13         now=(now+m-1)%n;
14         if(now==0)    now=n;
15         printf("%d ",q[now]);
16         for(int i=now;i<n;i++)    q[i]=q[i+1];
17         n--;
18     }
19     return 0;
20 }
View Code 3 the quickest

 

posted @ 2017-03-20 21:07  Aptal丶  阅读(323)  评论(0编辑  收藏  举报