首页 > 其他分享 >又是经典的约瑟夫环问题plus版本及vector的熟练使用

又是经典的约瑟夫环问题plus版本及vector的熟练使用

时间:2024-09-06 16:53:30浏览次数:12  
标签:temp int indx 约瑟夫 vector plus 2.2 data

目录

1. 前言

2. 正文

2.1 问题

2.2 解决办法

2.2.1 思路

2.2.2 代码实现

2.2.3 测试结果

3. 备注


1. 前言

我记得之前第一次遇到这个题目是当时说的是固定的一个数,就是说固定数3个数,显然比这个简单一点,因为动的数据显然更麻烦一点。有兴趣的小伙伴可以先去看之前的那篇博客。

2. 正文

2.1 问题

题目描述:

设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。

输入格式:

输入多行,每行2个数,分别表示n和m.

输出格式:

计算每一行中最后剩下这个人的编号.

样例输入:

8 5

样例输出:

3

2.2 解决办法

2.2.1 思路

这个问题呢,肯定要先读懂题目,就是说一排人,在这个里找隔壁老王,从头开始喊,喊道固定的那个数的时候就出去,下一个人从一开始继续喊,如果队列中人不够,那么久从第一个续上接着喊,直到找到隔壁老王。

这个题目呢也有好多种方法,有从1开始给人编号,有的是将队列中的人都设置为0或者一,最后去遍历那个1或者0是第几个,方法等等。

我使用的是容器给每个人编号的方法,思路就是通过增删改查,最后得到一个元素,读出元素的值就是老王。

这个难点就在于这个删除的时候的迭代器的问题,要考虑到,剩余人数大于报数值,剩余人数等于报数值,剩余人数小于报数值这三种情况,因此只要将这三种情况处理好,那么就没有太大的问题。

在这个过程中可以增加对c++中容器的熟练使用。

看完题目之后,大家还是可以现场是写一下,必经过程和思路都是最重要的。

2.2.2 代码实现

由于思路很清晰,代码就没有太多的注释。

#include <iostream>
#include <vector>
using namespace std;
void updatePeople(vector<int> &data, int &n)
{
    for (int i = 0; i < n; i++)
    {
        data.push_back(i + 1);
    }
}
int lastPeopleNumber(vector<int> &data, int &m)
{
    size_t temp = 0;
    int indx = 1;
    try
    {
        while (data.size() > 1)
        {
            temp++;
            indx++;
            if (data.begin() + temp == data.end())
            {
                temp = 0;
            }
            if (indx == m)
            {

                data.erase(data.begin() + temp);
                indx = 1;
            }
            if (data.begin() + temp == data.end())
            {
                temp = 0;
            }
        }
    }
    catch (const char *message)
    {
        cerr << "error:" << message << endl;
    }
    return data.at(0);
}
int main()
{
    int n, m;
    vector<vector<int>> multi_group(0, vector<int>(2));
    vector<int> people;
    while (cin >> n >> m)
    {
        multi_group.push_back(vector<int>{n, m});
    }
    for (auto temp : multi_group)
    {
        people.clear();
        n = temp.at(0);
        m = temp.at(1);
        updatePeople(people, n);
        cout << lastPeopleNumber(people, m) << endl;
    }
    return 0;
}

2.2.3 测试结果

测试结果也是非常的美丽。

 大家可以直接在这个线上的编译环境执行

码曰 - 让代码在云端多飞一会 (dotcpp.com)

3. 备注

>>>>>>

当时因为这个迭代器的判断老师倒是报端错误,真是气死人了。当时可无语了,感觉都没有错,但是重新分析过那三种情况之后,就悟了。

>>>>>>

人的一生是短的,但如果卑劣地过这一生,就太长了。——莎士比亚

 >>>>>>

制作不易,且行且珍惜,点个关注支持下吧。

标签:temp,int,indx,约瑟夫,vector,plus,2.2,data
From: https://blog.csdn.net/m0_64395065/article/details/141962825

相关文章

  • elementplus vue3 table表格动态合并单元格
    letcellList:any[]=[]//单元格数组letcount:number=0//计数constcomputeCell=(tableList:any[],name)=>{cellList=[]count=0for(leti=0;i<tableList.length;i++){if(i===0){//先设置第一项cellList.push(1)......
  • element-plus 倒计时el-countdown添加背景色
    效果图: 实现方法:<el-countdown:time="countdownTime":formatter="formatter"/><divv-html="formattedTime"></div>formatter(time){constdays=Math.floor(time/1000/60/60/24......
  • 【C++】简单易懂的vector迭代器
    一、迭代器的本质vector的迭代器本质上就是一个被封装的指针。迭代器的用法和指针的用法十分相似,就是一个像指针的假指针,我们不妨把迭代器看作一个伪指针。二、迭代器的使用句式(可以看到迭代器和指针很像):迭代器有四种:1、正向迭代器:容器名<类型>::iterator迭代器名2、常......
  • 怎样用c++实现一个vector类
    给定的任务是用C++实现一个类,这个类的行为要和标准库中的Vector类一样。向量(Vector)就像动态数组一样,当插入或删除一个元素时,它能够自动调整自身大小,其存储由容器自动管理。vector中的元素被放置在连续的存储空间中,这样就可以使用迭代器来访问和遍历它们。在向量中,数据是在末尾插......
  • 【C++】vector有关代码
     C++代码:#include<iostream>#include<vector>intmain(){//创建一个整数类型的vector并初始化std::vector<int>v={1,2,3};//使用迭代器遍历并打印vector中的每个元素for(autoi=v.begin();i!=v.end();++i){std::c......
  • 滚雪球学MyBatis-Plus(11):多数据源配置
    前言在上期内容中,我们详细介绍了如何使用MyBatisPlus的代码生成器。通过代码生成器,我们能够根据数据库表结构自动生成实体类、Mapper接口、服务类、控制器和XML映射文件,大大提高了开发效率,并减少了重复劳动。同时,我们还探讨了如何进行代码生成器的自定义配置,使其生成......
  • 滚雪球学MyBatis-Plus(12):高级功能
    前言在上期内容中,我们详细探讨了MyBatisPlus的多数据源配置。通过多数据源配置,我们可以连接多个数据库,并在运行时动态切换数据源,显著提高应用程序的灵活性和扩展性。我们详细介绍了多数据源配置的实现方法,并通过实例演示了如何在项目中应用这些技术。本期内容将深入探......
  • element-plus中的el-table组件tooltip显示错位
    问题描述:element-plus组件库中的el-table组件有一个show-overflow-tooltip属性,设置为true时如果表格中数据过长就会显示一个浮动窗口就像这样而有时这个小浮窗会有错位的问题像是这样,会导致靠上的列浮窗直接越界不显示问题原因table下的tooltip是fixed定位。positi......
  • 保姆级教程:Dupay从注册到充值开卡全过程,可开GPT Plus、可绑定GPT充值API余额
    前言想要购买GPTPlus,或者给GPT充值,绑定国内visa信用卡,会被拒,于是便问问度娘,找到了一篇关于注册虚拟卡的教程,搬过来顺便修改下!应用场景1、DepayMasterVisa卡支持绑定宝、微、美外卖、拼多、Paypal(国区、美区、港区)、天猫国际版等等。2、支持Stripe商户、googleplay商......
  • 了解MyBatis-Plus&Druid数据源
    MyBatis-Plus简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上进行了增强而不改变其原有的功能,旨在简化开发、提高效率。以下是对MyBatis-Plus的详细简介:一、基本概述定义:MyBatis-Plus是在MyBatis基础上进行增强的一个框架,通过提供一系列的特性和工具,极大......