codevs 1282 约瑟夫问题

来源:互联网 发布:淘宝好评返现怎么弄 编辑:程序博客网 时间:2024/06/06 17:22

codevs 1282 约瑟夫问题
题目描述 Description
有编号从1到N的N个小朋友在玩一种出圈的游戏。开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边。编号为1的小朋友站在编号为N的小朋友左边。首先编号为1的小朋友开始报数,接着站在左边的小朋友顺序报数,直到数到某个数字M时就出圈。直到只剩下1个小朋友,则游戏完毕。

现在给定N,M,求N个小朋友的出圈顺序。

输入描述 Input Description
唯一的一行包含两个整数N,M。(1<=N,M<=30000)

输出描述 Output Description
唯一的一行包含N个整数,每两个整数中间用空格隔开,第I个整数表示第I个出圈的小朋友的编号。

样例输入 Sample Input
5 3

样例输出 Sample Output
3 1 5 2 4

题解:

#include<iostream>#include<cstdio>using namespace std;int a[100000+10];int main(){    int n,m;    int s=1;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        a[i]=i;    }    int i;    while(n)    {        i=(s+m-1)%n;//找出数到的小朋友        if(i==0)        {            i=n;        }        printf("%d ",a[i]);        for(int j=i;j<n;j++)        {            a[j]=a[j+1];//删除数到的小朋友        }        n--;        s=i;    }    return 0;}

暴力(TLE):

#include<iostream>#include<cstdio>using namespace std;int vis[100000+10];int main(){     int n,t;    scanf("%d%d",&n,&t);    int ans;    int now=0;    int x=0;    for(int k=1;k<=n;k++)    {        while(x<t)        {            now++;            if(now>n)            {                now=1;            }            if(vis[now])            {                continue;            }            else            {                x++;            }        }        x=0;        vis[now]=1;        ans=now;        printf("%d ",ans);    }    return 0;}
2 0
原创粉丝点击