zoukankan      html  css  js  c++  java
  • 【luoguP1996】【luogu-original】约瑟夫问题

    先来看题目:

                  P1996 约瑟夫问题

    题目背景

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

    题目描述

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

    输入输出格式

    输入格式:n m
    输出格式:出圈的编号

    输入输出样例

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

    说明

    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;
    }    
  • 相关阅读:
    Go语言操作etcd
    grafana使用
    Java整理
    Go操作MySQL
    Go语言操作Redis
    es
    influxDB
    gopsutil
    Java基础之(三):IDEA的安装及破解 lyl
    ClojureScript 点访问格式
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/luoguP1996.html
Copyright © 2011-2022 走看看