模拟算法(一):一维数组模拟

目录

模拟的概念

例1:开关灯

算法思路:

代码如下:

输入输出:

例2:序列操作和查询

算法思路:

代码如下:

输入输出:

例3:数组折叠

算法思路:

代码如下:

例4:数字消除

算法思路

代码如下:

作业1:角谷猜想

作业2:校门外的树

作业3:乒乓球


模拟的概念

模拟算法就是模拟题目给的操作,用代码一步一步的描述出来即可。在过程中使用的都是我们已知的各种方法,如数组元素调用、排序、枚举等等,只是这些过程一般比较复杂。本次课程主要针对一维数组的模拟。

在各类算法竞赛中,包括CSP-J/S,NOIP等竞赛,经常会出现各类“模拟题目”,遇到这种题大家不需要害怕,甚至可以将其作为“送分题”,因为你只需要按照题目叙述的方式来写程序就能得到最终答案。模拟不是一种算法,而是一种技巧,要想掌握模拟题目,就需要多读题、多整理细节问题。

例1:开关灯

【描述】有n盏灯,从1到N按顺序依次编号,初始时所有灯都处于开启状态;有m个人,从1到m依次编号。第一个人将灯全部关闭,第二个人将编号为2的倍数的灯打开,第三个人将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都一样,将凡是自己编号倍数的灯做相反处理。请问:当第m个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,用逗号间隔。

【输入】一行,n和m,空格隔开

【输出】顺次输出关闭的灯的编号,用逗号隔开

【输入样例】10 1010

【输出样例】1,4,9

算法思路:

这个问题是一个经典的编程问题,通常被称为“灯泡问题”或“约瑟夫环问题”的变体。问题的核心在于模拟每个人对灯的操作,并跟踪每盏灯的状态。以下是解决这个问题的详细思路:

 1. 初始化

- 创建一个数组 `lights`,长度为 `n+1`(因为灯的编号从1到n),初始时所有灯都设置为开启状态(例如,可以用 `true` 表示开启)。

 2. 模拟操作

  - 对于每个人(从1到m),执行以下操作:
  - 遍历所有灯,找到编号是当前人编号的倍数的灯。
  - 切换这些灯的状态(如果灯是开启的,则关闭;如果灯是关闭的,则开启)。

3. 状态切换

  - 灯的状态切换可以通过简单地取反数组中对应位置的值来实现。例如,如果 `lights[j]` 是  `true`,则将其设置为 `false`,反之亦然。

 4. 收集结果

  - 在所有人操作完成后,遍历 `lights` 数组,收集所有关闭的灯的编号。

 5. 输出结果

  - 将收集到的关闭的灯的编号按从小到大的顺序输出,编号之间用逗号隔开。

代码如下:

#include <iostream>
using namespace std;
int main(){bool lights[1000];int n,m;cin>>n>>m;for(int i=1;i<=n;i++){lights[i]=true;}for(int i=1;i<=m;i++){for(int j=i;j<=n;j=j+i)lights[j]=!lights[j];}int cnt=0;for(int i=1;i<=n;i++){if(!lights[i]){cnt++;if(cnt==1) cout<<i;else cout<<","<<i;}	}

输入输出:

例2:序列操作和查询

【描述】现有一个长度为n的数组,对这个数组进行m次操作,可以对数组进行的操作分为以下三类:

输入1 i: 表示输出数组中第i个元素的值;

输入2 i v:表示在数组中第i个元素前加入新的元素v;

输入3 i:表示删除数组中的第i个元素。

注意:三类操作都要满足 i <= n。经过m轮操作后,输出的是哪些数字,每行一个数字。

【输入】第1行一个整数n,表示数组的初始长度;第2行是n个用空格间隔的数,表示原始的数组;第3行是整数m,表示操作次数。接下来m行是m次操作指令,每个指令一行(题目描述中的三类操作中的一种)。

【输出】对于第一种操作输出对应的答案,一行输出一个数。

算法思路:

对题目的要求一步一步的实行,先保证数组的输入以后,需要对三种情况进行分类处理。第一种处理里面有输出,后面两种都是在操作。操作的要点是数组的插入和删除。

插入的话,就要求插入位置后面所有数字向后移动一步,实现a[i+1]=a[i]的操作;

而删除则需要当前位置后面所有的数字向前移动一步,实现a[i]=a[i+1]。这里需要注意移动的方向,要从头移动。

代码如下:


using namespace std;
int main(){int a[1000];int n,m,p,q,v;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>m;for(int i=1;i<=m;i++){cin>>p;if(p==1){cin>>q;cout<<a[q]<<endl;}else if(p==2){cin>>q>>v;for(int j=n;j>=q;j--)a[j+1]=a[j];a[q]=v;n++;}else{//p=3cin>>q;for(int j=q;j<n;j++)a[j]=a[j+1];n--;}}
}

输入输出:

例3:数组折叠

【描述】李雷和韩梅梅在玩数组折叠游戏,游戏规则是,给出n个整数,按照从左到右的顺序排列,现在需要将这列整数从中间折叠m次,右边的叠加到左边,每次折叠后,重合的两个数字会相加变成一个新的数字。请你输出折叠m次后的s数组。
【输入】第1行是整数n和m;第2行是数组中的n个整数

【输出】1行。折叠m次后的数组元素

算法思路:

数组对折,需要把后半部分移动到前半部分对应位置进行数组相加,所以移动次数为n/2(即循环次数),然后需要进行的就是数组加法,最后要对数组长度也做n/2的操作,但是这里需要注意的是,如果长度是奇数不能只是简单的n/2哦,对称位置怎么找?

如果数组下标从1开始,那么第个元素的对称元素位置是谁? 找找规律:1对n;2对n-1;3对n-2;i对什么?

代码如下:

#include <iostream>
using namespace std;int main() {int a[1000]; // 假设数组最大长度为 1000int n, m;cin >> n >> m; // 输入数组长度和操作次数 for (int i = 0; i < n; i++) { // 输入数组元素cin >> a[i];}for (int j = 0; j < m; j++) { // 进行 m 次操作for (int i = 0; i < n / 2; i++) { // 遍历前半部分a[i] = a[i] + a[n - 1 - i]; // 将前半部分和后半部分对应元素相加}if (n % 2 == 1) {// 如果数组长度是奇数,中间元素保持不变n = n / 2 + 1;} else {n = n / 2;}}for (int i = 0; i < n; i++) { // 输出最终结果cout << a[i] << " ";}return 0;
}

例4:数字消除

【描述】李雷喜欢玩游戏,有一天他在电脑上发现 了一个叫“数字消消消”的游戏,其规则如下: 给定一个长度为n的整型数组,指定一个数a,如果该数组中有3个及3个以上的a连续出现,则该数字将会从数组中消除。

【输入】第1行是整数n和a;第2行是数组中的n个整数

【输出】1行。输出消除后的数组

【样例输入】 6  1

                      1 1 1 2 2 3

【样例输出】 2 2 3

算法思路

1、输入处理:

  • 首先读取两个整数 na,分别表示数组的长度和需要移除的数字。
  • 然后读取数组中的 n 个整数到数组 arr 中。

2、双重循环检测

  • 使用一个外层循环 for(int i=0; i<n; i++) 遍历数组的每个元素。

  • 对于每个元素,使用一个内层循环 for(int j=i; j<n; j++) 检查从当前元素开始的连续相同数字的数量。

  • 如果当前元素 arr[j] 等于 a,则增加计数器 num;如果不等于 a,则跳出内层循环。

3、移除连续相同数字

  • 如果计数器 num 大于等于 3,说明从索引 i 开始有连续三个或更多的 a,需要跳过这些元素。

  • 使用 i=i+num-1 将外层循环的索引跳过这些连续的 a

  • 如果 num 小于 3,说明当前元素不是连续三个或更多的 a,需要输出该元素。

4、重置计数器

  • 每次完成一次内层循环后,重置计数器 num 为 0,以便下一次检测。

5、输出结果

  • 在外层循环中,对于不满足连续三个或更多 a 的元素,输出该元素。

代码如下:

#include <iostream>
using namespace std;
int main(){int n,a;int arr[1000];cin>>n>>a;for(int i=0;i<n;i++)cin>>arr[i];int num=0;for(int i=0;i<n;i++) {for(int j=i;j<n;j++){if(arr[j]==a)num++;elsebreak;}if(num>=3)i=i+num-1;elsecout<<arr[i]<<" ";num=0;}
}

作业1:角谷猜想

【描述】 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。 程序要求输入一个整数,将经过处理得到1的过程输出来。

【输入 】一个正整数N(N <= 2,000,000)

【输出】从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。

【样例输入】 5

【样例输出】 5*3+1=16

                      16/2=8

                       8/2=4

                       4/2=2

                       2/2=1

                       End

【提示】注意计算过程中中间值可能会超过int范围。

作业2:校门外的树

【描述】某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

【输入】第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
        对于20%的数据,区域之间没有重合的部分;
        对于其它的数据,区域之间有重合的情况。

【输出】包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

【样例输入】 500  3

                      150  300

                      100  200

                      470  471

【样例输出】 298

作业3:乒乓球

【题目背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 11 分制和 21 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

【题目描述】 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 11 分制和 21 分制下,双方的比赛结果(截至记录末尾)。 比如现在有这么一份记录,(其中 W 表示华华获得一分,L 表示华华对手获得一分):                                              WWWWWWWWWWWWWWWWWWWWWWLW

在 11 分制下,此时比赛的结果是华华第一局 11 比 0 获胜,第二局 11 比 0 获胜,正在进行第三局,当前比分 1 比 1。而在 21 分制下,此时比赛结果是华华第一局 21 比 0 获胜,正在进行第二局,比分 2 比 1。如果一局比赛刚开始,则此时比分为 0 比 0。直到分差大于或者等于 2,才一局结束。 注意:当一局比赛结束后,下一局立刻开始。 你的程序就是要对于一系列比赛信息的输入(WL 形式),输出正确的结果。

【输入格式】 每个输入文件包含若干行字符串,字符串由大写的 W 、 L 和 E 组成。其中 E 表示比赛信息结束,程序应该忽略 E 之后的所有内容。

【输出格式】 输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 11 分制下的结果,第二部分是 21 分制下的结果,两部分之间由一个空行分隔。

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

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

相关文章

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…

Qt中的多种输出方式,信号与槽的基本使用

完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框&#xff0c;创建项目后&#xff0c;展开forms文件夹&#xff0c;双击ui文件进入 qt designer设计页面 找到line edit 拖到页…

英语表达年代和世纪

英语表达年代和世纪 1. Century (世纪)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英语表达年代和世纪4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的连续 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年这连续 10 年。 XX 世纪 X0 年代…

MySQL数据库管理5

23.事务 1&#xff09;事务&#xff1a;可以认为是做一件事情 需要多个SQL 要么同时成功 要么同时失败 需求&#xff1a;银行转账update 你的账户 把你的钱减少update 你朋友的账户 把他的钱增多​这两个SQL不能只成功一个 要么都成功 要么都失败那么 我们就需要用到事务了 它…

闭包和装饰器

什么是闭包 闭包&#xff08;Closure&#xff09;是 Python 中一个非常重要的概念&#xff0c;它是一种特殊的函数对象&#xff0c;通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释&#xff1a; 1.闭包的定义 闭包是指一个函数对象&#xff0c;它不仅包含函数的代…

notepad++8.6.4安装及细节

notepad8.6.4下载安装&#xff08;附安装包&#xff09; 一、安装包下载1.1方法一&#xff1a;官网下载&#xff08;点击跳转&#xff09;1.2方法二&#xff1a;网盘链接分享8.6.4版本 二、安装过程细节2.1这里的组件建议全部勾选。点击“下一步”。2.2 勾选①&#xff1a;可以…

COZE通关指南:工作流与插件开发

前言 本文隶属于专栏《AI Agent 通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《AI Agent 通关指南》 正文 1. 平台基础介绍 🌟 1.1 COZE平台概述 COZE平台(coze.cn)是一个强大的AI应用开发平台…

【Block总结】ENLTransformerBlock,高效非局部变换器块|即插即用

1. 论文信息 标题: Perspective+ Unet: Enhancing Segmentation with Bi-Path Fusion and Efficient Non-Local Attention for Superior Receptive Fields论文地址: arXiv:2406.14052 2. 创新点 双路径编码策略: 在编码器阶段引入双路径策略,结合传统卷积和空洞卷积的结果,平…

【爬虫】网易云音乐评论数据爬取

文章目录 &#x1f356; 前言&#x1f3b6;一、抓取要求✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【爬虫】网易云音乐歌词/评论数据爬取 &#x1f3b6;一、抓取要求 描述: 输入歌曲的id&#xff0c;获取对应歌曲的用户评论信…

C++使用Qt Charts创建数据可视化图表

Qt Charts 是一个强大的工具&#xff0c;用于创建直观的数据可视化图表。本文将通过一个具体的示例&#xff0c;展示如何使用 Qt Charts 创建一个包含多条数据序列、自定义坐标轴和随机数据生成的图表。 示例代码解析 以下是一个完整的示例代码&#xff0c;展示如何使用 Qt Ch…

TCP/IP五层协议

目录 1. 五层模型结构 2. 各层核心功能与协议 (1) 应用层&#xff08;Application Layer&#xff09; (2) 传输层&#xff08;Transport Layer&#xff09; (3) 网络层&#xff08;Network Layer&#xff09; (4) 数据链路层&#xff08;Data Link Layer&#xff09; (5…

【最新版】金媒婚恋系统v10.5最新稳定开源+原生前端小程序 PC端+安装教程

一.系统简介 1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好&#xff0c; 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务&#xff0c;通过红娘的介入&#xff0c;提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管…

吴恩达深度学习复盘(5)神经网络的前向传播TesorFlow与NumPy实现比对

数据结构差别 NumPy 和 TensorFlow 在数据表示上的差异展开&#xff0c;结合神经网络实践中的常见问题进行说明。以下是详细解析&#xff1a; 一、简介 数据表示的历史背景 NumPy 是 Python 科学计算的基础库&#xff0c;早期设计为处理多维数组TensorFlow 由 Google Brain 团…

多元高斯分布函数

1、 n n n元向量 假设 n n n元随机变量 X X X X [ X 1 , X 2 , ⋯ , X i , ⋯ , X n ] T μ [ μ 1 , μ 2 , ⋯ , μ i , ⋯ , μ n ] T σ [ σ 1 , σ 2 , ⋯ , σ i , ⋯ , σ n ] T X i ∼ N ( μ i , σ i 2 ) \begin{split} X&[X_1,X_2,\cdots,X_i,\cdots ,X_n…

洞察 Linux 进程管理

一、进程和线程的概念 1.进程 &#xff08;1&#xff09;概念 进程是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位。进程是程序的执行实例&#xff0c;拥有独立的资源&#xff08;如内存、文件描述符等&#xff09;。每个进程在创建时会被…

PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)

本文提供一个适用于图像输入的多头注意力机制&#xff08;Multi-Head Attention&#xff09;PyTorch 实现&#xff0c;适用于 ViT、MAE 等视觉 Transformer 中的注意力计算。 模块说明 输入支持图像格式 (B, C, H, W)内部转换为序列 (B, N, C)&#xff0c;其中 N H * W多头注…

每日一题(小白)字符串娱乐篇16

分析题意可以了解到本题要求在一串字符串中找到所有组合起来排序递增的字符串。我们可以默认所有字符在字符串中的上升序列是1&#xff0c;从第一个字符开始找&#xff0c;如果后面的字符大于前面的字符就说明这是一个上序列那么后面字符所在的数组加一&#xff0c;如果连接不上…

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)

一、安装步骤 1.基础环境安装 安装显卡驱动、cuda&#xff0c;根据自己硬件情况查找相应编号&#xff0c;本篇不介绍这部分内容&#xff0c;只给出参考指令&#xff0c;详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…

Immutable.js 完全指南:不可变数据的艺术与实践

引言 在现代前端开发中&#xff0c;状态管理是一个核心挑战。随着应用复杂度增加&#xff0c;如何高效、安全地管理应用状态变得至关重要。Immutable.js 是 Facebook 推出的一个 JavaScript 库&#xff0c;它提供了持久化不可变数据结构&#xff0c;可以帮助开发者更好地管理应…

字符串数据类型的基本运算

任务描述 本关任务&#xff1a;从后台输入任意三个字符串&#xff0c;求最大的字符串。 相关知识 字符串本身是存放在一块连续的内存空间中&#xff0c;并以’\0’作为字符串的结束标记。 字符指针变量本身是一个变量&#xff0c;用于存放字符串的第 1 个字符的地址。 字符数…