JZ62 孩子们的游戏(圆圈中最后剩下的数)

news2024/9/21 12:37:20

题目来源:牛客

题目描述:

每年六一儿童节,牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中,有个游戏是这样的:首先,让 n 个小朋友们围成一个大圈,小朋友们的编号是0~n-1。然后,随机指定一个数 m ,让编号为0的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0... m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客礼品,请你试着想下,哪个小朋友会得到这份礼品呢?

 

说明:

本题困扰了我一段时间,因为人的编号是从0开始的,最后一个人是n-1,但是报数却是1,2,3这样的报数,个人因为强迫症而无法理解,在想通后分享给大家

其实看到这道题后,大家都能想到一个叫做环形队列的东西,思路就是这个的扩展,下面我们来讨论别的解决方法

方法一

int LastRemaining_Solution(int n, int m) {
        queue<int> q;
        for(int i=0;i<n;i++)
        {
            q.push(i);
        }
        while(q.size()>1)
        {
            for(int i=0;i<m-1;i++)
            {
                q.push(q.front());
                q.pop();
            }
            q.pop();
        }
        return q.front();
    }

 思路:我们使用队列,输入n和m,有n个数据,将数据从0到n-1全部先入队列(因为是0开头,所以最后是n-1),然后我们开始删除元素,只要剩余元素数量大于1,我们就一直删,我们要删除的是第m个元素,报数是从1开始,是1,2,3,...,m,我们把队列的前m-1个元素按顺序移动到队列尾部,此时队列头部的元素就是第m个元素,也就是我们需要删除的元素,这样循环即可

方法二(重点)

int LastRemaining_Solution(int n, int m) {
        if(n<=0)
            return -1;
        int p = 0;
        for(int i=1;i<=n;i++)
        {
            p = (p+m)%i;
        }
        return p;
    }

下面我们来看这种思路,这里我们举例子说明,n=5,m=3

我们假设此时报数已经结束,只剩最后一个元素,按顺序被删掉的元素是2,0,4,1,此时剩余的元素是3,因为只剩一个元素,所以标号是0,此时我们进行倒推

在只剩2个元素时,是1,3,编号是0,1

在只剩3个元素时,是1,3,4,编号顺序为0,1,2

4个元素时,是3,4,0,1

5个元素时,是0,1,2,3,4

我这里的排列顺序为删掉元素后,下一位是新的开头,为标号0,比如5个元素时我们删除2,此时3就是新的开头,所以剩余4个元素时,顺序是3,4,0,1

借用方法一的思路,我们可以知道,删除一个元素后,相当于把整个队列向前推进m,我们想,从剩余5个元素开始,我们删除了2,那么3就是新的开头,3就向前移动了m位(3位),其他的跟着走,变成3,4,0,1,我们一直删一直删,删到只剩一个元素,也就是只剩3,那我们每次增加一个元素,让他每次向后移动3位,一直增加到5个元素,最终得到的不就是3的起始位置吗?

我们看代码,p即为我们最终所求结果,p的初始值为0,这是因为我们最终只有3一个元素,编号也就只有0,所以这里初始值为0

p=p+m,这个大家都可以理解,我们每次需要让p向后移动m位

p=(p+m)%i ,以及循环初始值 i 是什么意思?为什么最终是<=n呢?

i 的初始值 i = 1,这代表我们最开始只有一个元素,其他元素都被我们删除了,只剩下3

%i 是为了防止超出界限,想一想,当 i = 2 时,此时我们增加了一个元素,就是1,3,这时候只有两个元素,所以此时 i 是等于2的,因为只有两个元素,所以编号p最大也不可能超过 i (这里就是2),所以要%i

按照这个思路,我们不断增加元素,不断向后移动,当元素数量增加到n时,也就是 i = n时,就可以得到结果,用我们的例子来说,就是3的位置,也是3的编号

如果大家还是不理解,就结合这张图看,其中红色下标线的表示本次要删除的元素,绿色框起来的表示元素不够时,依次循环起来,也就是说,没有框起来的代表本次有多少元素参与,我们的思路是从下往上看,大家自己画一画,就可以轻松理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 课程任务

** ** https://github.com/InternLM/Tutorial/pull/905 https://github.com/onlyzer0/all_you_need/blob/main/README.md

Dify中固定递归字符文本分割器的chunk长度计算方式

本文主要从源码角度剖析了Dify中FixedRecursiveCharacterTextSplitter的chunk长度计算方式。 1.self._length_function(chunk) 源码位置:dify\api\core\splitter\fixed\_text\_splitter.py\FixedRecursiveCharacterTextSplitter类\split\_text方法\self.\_length\_function(…

实验9 存储过程与函数的创建管理实验

一、实验目的&#xff1a; 理解存储过程和函数的概念。掌握创建存储过程和函数的方法。掌握执行存储过程和函数的方法。掌握游标的定义、使用方法。 二、实验内容 1&#xff0e;某超市的食品管理的数据库的Food表&#xff0c;Food表的定义如表所示&#xff0c; Food表的定义…

GESP 2023年12月C++二级真题

参考程序1&#xff1a; #include<iostream> using namespace std;int first,second; int m,n; int sum 0;int fn(int n) {if(n1) {return first;} else if (n2) {return second;} else {return fn(n-1)fn(n-2);} } int main() {cin>>first>>second;cin>…

【Golang】map的使用

map声明的方式 //声明var m map[string]string//在使用map之前&#xff0c;先make&#xff0c;make的作用就是给map分配空间m make(map[string]string)m["lover"] "Yzx"m["friend1"] "Zxw"m["friend2"] "Zzc"…

【电子通识】什么是无源元件的认证用可靠性试验标准AEC-Q200?

目前电动汽车已经是一个大趋势&#xff0c;汽车上安装有由多个电子零部件构成的ECU&#xff08;电子控制单元&#xff09;。即使汽车在恶劣的环境下行驶&#xff0c;电子零部件也必须不出故障地正常工作。因此&#xff0c;车载电子零部件与消费类电子相比&#xff0c;要求其达到…

Idea调试Kotlin代码

1.配置java虚拟机jvm远程调试 例如 启动程序配置 java -agentlib:jdwptransportdt_socket,servery,suspendn,address127.0.0.1:5005 -jar KtTest.jar IDEA配置远程调试JVM idea编译的Kt代码为 // IntelliJ API Decompiler stub source generated from a class file // Im…

人工智能是帮助开发人员还是取代他们?

最近&#xff0c;神经网络已经成为应用开发中不可或缺的工具。它们大大简化和加速了这一过程。 例如&#xff0c;使用GitHub Copilot&#xff0c;可以根据任务描述自动生成重复的代码部分。神经网络可以创建和运行测试&#xff0c;识别错误&#xff0c;甚至提出修复错误的方法…

数据库管理软件Navicat Premium介绍

1、点击连接 2、主界面 3、软件版本 待续...

【ZYNQ】VDMA 的使用

VDMA, Video Direct Memory Access 是 Xilinx 官方提供的高速内存存取 IP,采用 AXI4-Stream 与 AXI4 协议实现存储映射接口(Memory Map)与非存储映射接口(Non-Memory Map)接口的转换,主要用于视频数据缓存,同时提供帧缓存与帧同步控制功能。本文主要介绍 AXI VDMA 的配置…

博客文章多平台发布工具

做过博客分享和自媒体的同学应该都知道&#xff0c;在多个平台上同步发布、更新自己的原创内容&#xff0c;是快速传播知识、提高用户触达率的有效方式。 然而&#xff0c;一篇文章要在N个平台上重复进行编辑、排版、图片/视频上传的苦恼&#xff0c;你一定经历过吧&#xff1…

字符串哈希详解,单hash,双hash,滚动哈希

一、字符串哈希 1.1 基本概念 字符串哈希 将不同的字符串映射成不同的整数。 思想&#xff1a;将字符串映射成一个 p进制数字。 我们定义如下哈希函数&#xff1a; h a s h ( s ) ∑ i 1 n s [ i ] p n − i ( m o d M ) 其中 s 为长度为 n 的字符串&#xff0c;下标从…

自动驾驶中,实现三维点旋转原理

文章目录 1. 三维点旋转的方案2. 使用复数表示二维点的旋转2.1. 复数的概念2.2. 复数的三种形式及相互转换2.3. 复数概念扩展&#xff1a;实数、虚数、复数 3. 四元数旋转三维点原理4. 使用四元数进行旋转的公式5. 旋转叠加6. 四元数转换为三维点7. 代码实现 1. 三维点旋转的方…

《昇思25天学习打卡营第19天|生成式-Pix2Pix实现图像转换》

学习内容&#xff1a;Pix2Pix实现图像转换 1.模型简介 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c…

基于javaScript的简易ATM机

目录 一.设计要求 二.设计思路 三.案例展示 四.源代码展示 一.设计要求 首先里面已经存放了100元钱。如果用户执行存钱操作&#xff0c;就将输入进去的存钱数目和现有的钱相加&#xff0c;再显示余额提示框。如果用户执行取钱操作&#xff0c;就用现有的钱减去要取出钱的数目…

AutoHotKey自动热键(七)WINDOWS按键映射与鼠标映射(替换/组合)

该脚本支持简单的按键替换,可以针对某个窗口进行按键替换,还可以对鼠标和键盘进行互相替换,也可以用来禁用一些按键 键盘按键映射 普通按键映射 a::b这样子就直接在全局把所有的a键输入都映射成b键输出 上面这一行在执行过程中相当于拆解成下面两个,第一个是按下,第二个是弹…

【刷题汇总 --游游的水果大礼包、买卖股票的最好时机(二)、倒置字符串】

C日常刷题积累 今日刷题汇总 - day0111、游游的水果大礼包1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(二)2.1、题目2.2、思路2.3、程序实现 3、倒置字符串3.1、题目3.2、思路3.3、程序实现 -- c语言3.4、程序实现 -- c 4、题目链接 今日刷题汇总 - day011 1、游游…

U盘打不开的终极解决方案:原因剖析、恢复策略与预防之道

U盘困境&#xff1a;打不开的焦虑与应对 在数字化时代&#xff0c;U盘作为数据交换与存储的重要工具&#xff0c;几乎成为了每个人工作、学习和生活中的必需品。然而&#xff0c;当您满怀期待地将U盘插入电脑&#xff0c;却遭遇“无法识别”、“无法访问”等提示&#xff0c;U…

安装isce2

今天再次尝试安装&#xff0c;之前试过2次都是卡在同一步&#xff0c;今天换成了用mamba conda就没有再报错了 全程参考云军老师的step by step教程&#xff0c;安装成功 GitHub - yunjunz/conda-envs: conda environment setup on Linux / macOS for InSAR data processing …

初识Spring Web MVC

1. 什么是 Spring Web MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"SpringMVC".Servlet&am…