【线性表】洛谷P1996 约瑟夫问题

简介: 前言 本题来自洛谷P1996. 题目链接:约瑟夫问题 - 洛谷

题目描述

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


输入格式

输入两个整数 n,m。


输出格式

输出一行 n 个整数,按顺序输出每个出圈人的编号。


输入输出样例

输入


10 3

输出


3 6 9 2 7 1 8 5 10 4

说明/提示

1≤m,n≤100


解题思路

解决该题的关键是如何来进行“圈”的模拟,我们先模拟一下题目中所说的报号以及出圈过程。


我们假设现在有4个人排成一圈,报到2号出圈

1.png

第一次报号

2.png

所以2出圈,第二次报号从3开始报。


第二次报号

3.png

所以4出圈,第三次报号从1开始。


第三次报号

4.png

所以3出圈,第四次报号只剩1。


第四次报号


只有1,所以1必出圈

5.png

此时出圈序列我们也可得到

6.png

出圈顺序为:2->4->3->1


那我们怎样来模拟这样一个圈呢?我们通过上述模拟过程可知,如果没有出圈的人,要参与到下一次的报号当中,如果出圈的话,就将这个人删除。我们熟悉的数组能否来完成这样的操作呢?答案是肯定的。我们可以通过上面分析可知,每次报号完后,下一次报号的人数就少了一人,所以我们可以在第一次报号的序列之后加上第二次报号的序列(即如果这个人没有出圈则将他加到数组的末尾元素,如果他出圈了,删除该元素),依次这样操作,直到最后一次的报号序列中只有一个人,无需再进行报号,直接出圈即可。所以,数组也是可以模拟这样的操作的。


这其实很类似用数组设计出来的一个数据结构-队列:如果报到m号出队,如果不是m号,出队后站到队尾,进行下一次报号,这样直到剩下最后一个人。


来看看代码怎样实现


#include <iostream>

#include <queue>

using namespace std;

int main()

{  queue<int> q;

  int n,m;

  cin>>n>>m;

  for(int i=1;i<=n;i++){

     q.push(i);

  }

  while(q.size()){

   //没叫到m号之前,将这个人出队,再站到队尾

    for(int i=1;i<m;i++){

 q.push(q.front());

       q.pop();

    }

   //输出每次叫到的第m号,全输出就是出圈顺序

    cout<<q.front()<<' ';

    q.pop();

  }

 return 0;

}

目录
相关文章
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
阿里云轻量应用服务器(Simple Application Server)作为面向个人开发者、中小企业等用户的入门级云产品,凭借其易用性、高性价比以及一站式服务体验,受到了广泛的欢迎。本文将全面解析阿里云轻量应用服务器的收费标准、最新活动价格以及适用场景,帮助用户更好地了解和选择这一产品。
阿里云轻量应用服务器收费标准、性能及适用场景全面解析
|
11月前
|
编译器 C++
#include<> 与#include ""的区别
在C++中,`#include &lt;&gt;` 和 `#include &quot;&quot;` 都用于包含头文件,但使用场景不同。`#include &lt;&gt;` 用于包含系统标准库头文件,编译器会在标准库路径中查找;而 `#include &quot;&quot;` 用于包含用户自定义的头文件,编译器会优先在当前项目目录中查找。
|
Web App开发 JavaScript 小程序
【有问必答】搭建uniapp项目流程手把手教学
本文详细介绍了uniapp项目的搭建流程、组件引入、接口封装及常用配置。作者“狗哥”应博友之邀,分享了其日常开发经验,包括HBuilderX的使用、uview-ui和moment.js的引入与配置、环境变量设置、HTTP请求封装及API接口管理等内容。文章强调理解官方文档的重要性,并提供了具体步骤和示例代码,帮助读者快速掌握uniapp开发技巧。
352 0
【有问必答】搭建uniapp项目流程手把手教学
Altium Designer中编译原理图之后出现 off grid at..... 的解决方法
Altium Designer中编译原理图之后出现 off grid at..... 的解决方法
1042 0
|
存储 前端开发 安全
深入理解React中的useState:函数组件状态管理的利器
深入理解React中的useState:函数组件状态管理的利器
|
人工智能 编解码 文字识别
视觉智能开放平台产品使用合集之人体姿态关键点识别是否提供在线服务
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
关系型数据库 MySQL 数据安全/隐私保护
被我误解的max_connect_errors
谈谈被我误解的max_connect_errors
被我误解的max_connect_errors
|
机器学习/深度学习 人工智能 分布式计算
大模型时代的人工智能+大数据平台,加速创新涌现
2023年10月31日,2023云栖大会上,阿里云副总裁、阿里云计算平台事业部负责人汪军华宣布阿里云人工智能+大数据平台升级发布,以服务大模型时代下各行各业的业务创新。
|
Shell
shell脚本获取当前脚本的文件名
shell脚本获取当前脚本的文件名
327 0