当前位置: 首页 > news >正文

信息学奥赛初赛天天练-20-完善程序-vector数组参数引用传递、二分中值与二分边界应用的深度解析

PDF文档公众号回复关键字:20240605
在这里插入图片描述

1 2023 CSP-J 完善程序1

完善程序(单选题,每小题 3 分,共计 30 分)

原有长度为 n+1,公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的开序数组可能不再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出被移除的元素。试补全程序。

源程序

01 #include <iostream>
02 #include <vector>
03
04 using namespace std;
05
06 int find_missing(vector<int>& nums){
07 		int left = 0, right = nums.size() - 1;
08 		while (left < right){
09   		int mid = left + (right-left) / 2;
10   		if (nums[mid]==mid+ ①){
11        		②;
12    		}else{
13      		③
14    		}
15   	}
16  	return ④;
17 }
18
19 int main(){
20 		int n;
21 		cin >> n;
22 		vector<int> nums(n);
23 		for (int i= 0; i< n; i++) cin >> nums[i];
24 		int missing_number = find_missing(nums);
25 		if(missing_number == ⑤) {
26     		cout << "Sequence is consecutive" << endl;
27 		}else{
28    		cout << "Missing number is " << missing_number << endl;
29 	    }
30 		return 0;
31 }

33 ①处应填( )

A 1 B nums[0] C right D left

34 ②处应填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

35 ③处应填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

36 ④处应填( )

A left+nums[0] B right+nums[0] C mid+nums[0] D right+1

37 ⑤处应填( )

A nums[0]+n B nums[0]+n-1 C nums[0]+n+1 D nums[n-1]

2 相关知识点

1) vector 参数传递-值传递

函数内形参改变对调用实参无影响

#include<bits/stdc++.h>
using namespace std;/*值传递 函数内增量了副本 函数内修改 对实参无影响 
*/ 
void testVector(vector<int> vec){vec.push_back(4); /*输出vec数组中每个元素,main函数实参传递过来3个2,函数内增加了1个4输出 2 2 2 4 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}
}int main(){vector<int> vec(3,2);//声明一个vector数组,初始化3个2 testVector(vec);//调用函数输出 cout<<endl; //testVector 增加的4 对main函数的vec没影响/*输出vec数组中每个元素3个2输出 2 2 2 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

2) vector 参数传递-指针传递

函数内形参改变,改变了调用的实参

#include<bits/stdc++.h>
using namespace std;/*指针传递 函数操作的是vector指针,通过指针对vector数组修改后vector被改变 
*/ 
void testVector(vector<int> *vec){(*vec).push_back(4); /*输出vec数组中每个元素,main函数实参传递过来3个2,函数内增加了1个4输出 2 2 2 4 */ for(int i=0;i<(*vec).size();i++){cout <<(*vec)[i]<< ' ';}
}int main(){vector<int> vec(3,2);//声明一个vector数组,初始化3个2 testVector(&vec);//调用函数输出 cout<<endl; //testVector 增加了4 /*输出vec数组中每个元素3个2和 4输出 2 2 2 4*/ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

3) vector 参数引用传递

函数内形参改变,改变了调用的实参

#include<bits/stdc++.h>
using namespace std;/*指针传递 形参相当于是实参的别名,对形参的操作其实就是对实参的操作,形参vector改变,实参也会改变 
*/ 
void testVector(vector<int> &vec){vec.push_back(4); /*输出vec数组中每个元素,main函数实参传递过来3个2,函数内增加了1个4输出 2 2 2 4 */ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}
}int main(){vector<int> vec(3,2);//声明一个vector数组,初始化3个2 testVector(vec);//调用函数输出 cout<<endl; //testVector 增加了4 /*输出vec数组中每个元素3个2和 4输出 2 2 2 4*/ for(int i=0;i<vec.size();i++){cout <<vec[i]<< ' ';}return 0;
}

4) 二分查找中间值

/* 向右逼近,如果找到满足条件的数,会继续向右找更大的数mid=(left+right)/2 left和right都接近最大值时,可能溢出可以使用下面写法替换mid=left + (right-left) / 2;
*//* 向左逼近,如果找到满足条件的数,会继续向左找更小的数mid=(left+right+1)/2 left和right都接近最大值时,可能溢出可以使用下面写法替换mid=left + (right-left+1) / 2;
*/

5) 二分找边界

//左闭右闭 while left right 最终left=right+1
while(left<=right)  left = mid + 1; right =mid-1;
//左闭右开 while left right 最终left=right
while(left<right)   left = mid + 1; right =mid;
//左开右闭 while left right 最终left=right
while(left<right)   left=mid;       right=mid+1;
//左开右开 while left right 最终left=right-1
while(left+1<right) left=mid;       right=mid;

3 思路分析

二分法,在本程序中find_missing函数就是利用二分法来找到一个长度为n的数组中不连续的位置,从而找出被移除 元素的值。只需通过二分找到从左往右第一处使得nums[i]不为nums[0]+i的的位置,那么在数组中被移除的数就是nums[0]+i

33 ①处应填( )

A 1 B nums[0] C right D left

答案 B

分析

/*
若数组连续, 一定有nums[i]==nums[0]+i,所以只需通过二分找到第一处使得nums[i]不为nums[0]+i的的位置即可。因此二分的判断条件是nums[mid]==mid+nums[0]所以选B
*/

34 ②处应填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

答案 A

分析

//由判断条件 nums[mid]==mid+nums[0] 可知,mid的左半部分是满足顺序的,继续往右找//由于mid计算是向下取整,需要向右靠近 所以left=mid+1
//int mid = left + (right-left) / 2; mid计算是向下取整 需要left=mid+1,向右逼近
int find_missing(vector<int>& nums){int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right-left) / 2;if (nums[mid]==mid+nums[0]){left=mid+1;//找到满足条件的继续向右找}else{right=mid;}}return left+nums[0];
}
//nums={0,1,3,4,5} 下面模拟具体细节
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 满足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid+1=1 right=2 不满足 while(left<right)
退出循环
返回left+nums[0]=2
*///int mid = left + (right-left) / 2; mid计算是向下取整 如果left=mid 可能会死循环
int find_missing(vector<int>& nums){int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right-left) / 2;if (nums[mid]==mid+nums[0]){left=mid;//如果改成left=mid 会死循环}else{right=mid;}}return left+nums[0];
}
//nums={0,1,3,4,5}时会死循环 下面模拟具体细节
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 满足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid=1 right=2 满足 while(left<right)
mid=(1+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid=1 right=2 满足 while(left<right)
*/

35 ③处应填( )

A left=mid+1 B right=mid-1 C right=mid D left=mid

答案 C

分析

/*
由于退出条件是 while (left < right) 最终退出时left==right ,前面又 left=mid+1,所以right==mid即可while(left<right) 对应 二分区间是前闭后开或者前开后闭
*/

36 ④处应填( )

A left+nums[0] B right+nums[0] C mid+nums[0] D right+1

答案 A

分析

//如果序列从0开始,最后1个找到的连续数字再找一个就是被移除的,前面示例
//nums={0,1,3,4,5} 下面模拟具体细节
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=3,mid+nums[0]=2+0=2 不等 rgiht=mid=2 left=0 满足 while(left<right)
mid=(0+2)/2=1 nums[1]=1,mid+nums[0]=1+0=1 相等 left=mid+1=1 right=2 不满足 while(left<right)
退出循环
返回left+nums[0]=2
移除的数是2
*///如果不从0开始
//nums={2,3,5,6,7}
/*
left =0 right=4
mid=(0+4)/2=2 nums[2]=5,mid+nums[0]=2+2=4 不等 rgiht=mid=2 left=0 满足 while(left<right)
mid=(0+2)/2=1 nums[1]=3,mid+nums[0]=1+2=3 相等 left=mid+1=2 right=2 不满足 while(left<right)
退出循环
返回left+nums[0]=2+2=4
移除的数是4
*/
//退出条件是while(left<right) 最终left==right
//所以答案A和B都对,一般习惯返回left

37 ⑤处应填( )

A nums[0]+n B nums[0]+n-1 C nums[0]+n+1 D nums[n-1]

答案 D

分析

找到数组的最后一个,无论最后一个是否相等都说明前面都是连续的

相关文章:

信息学奥赛初赛天天练-20-完善程序-vector数组参数引用传递、二分中值与二分边界应用的深度解析

PDF文档公众号回复关键字:20240605 1 2023 CSP-J 完善程序1 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 原有长度为 n1,公差为1等升数列&#xff0c;将数列输到程序的数组时移除了一个元素&#xff0c;导致长度为 n 的开序数组…...

推荐系统学习 一

参考&#xff1a;一文看懂推荐系统&#xff1a;召回08&#xff1a;双塔模型——线上服务需要离线存物品向量、模型更新分为全量更新和增量更新_数据库全量更新和增量更新流程图-CSDN博客 一文看懂推荐系统&#xff1a;概要01&#xff1a;推荐系统的基本概念_王树森 小红书-CSD…...

分库分表详解

文章目录 分库分表概述分库分表详解分库分表的策略分库分表的注意事项常用的分库分表中间件mysql单表达到多少数据量需要分库分表数据库分库分表缺点分表要停服吗&#xff0c;不停服怎么做 分库分表概述 分库分表是数据库架构设计中的一种常见策略&#xff0c;尤其是在面对大规…...

【java前端课堂】04_类的继承

类的继承 在Java中&#xff0c;继承是面向对象编程的四大基本特性之一&#xff0c;它允许我们根据一个已有的类来定义一个新的类&#xff0c;这个新的类继承了原有类的特性&#xff08;属性和方法&#xff09;&#xff0c;并可以添加新的特性或修改原有特性。这样&#xff0c;…...

React nginx配置,一个端口代理多个项目(转发后找不到CSS,JS及图片资源问题解决)

场景&#xff1a; nginx 配置负载均衡&#xff0c;甲方只提供一个端口&#xff0c;一个域名地址 方法&#xff1a; 一个端口一个域名匹配多个应用 方法一&#xff1a; 依靠设备浏览器区分: 使用UserAgent头来识别用户的客户端, CDN监测vary头的信息&#xff0c;如果内容不一致…...

Unity协程详解

什么是协程 协程&#xff0c;即Coroutine&#xff08;协同程序&#xff09;&#xff0c;就是开启一段和主程序异步执行的逻辑处理&#xff0c;什么是异步执行&#xff0c;异步执行是指程序的执行并不是按照从上往下执行。如果我们学过c语言&#xff0c;我们应该知道&#xff0…...

【iOS】UI学习(二)

目录 前言UIViewContorllerUIViewContorller基础UIViewContorller使用 定时器和视图移动UISwitch控件UIProgressView和UISlider总结 前言 本篇博客是笔者在学习UI部分内容时的成果和遇到的一些问题&#xff0c;既是我自己的学习笔记&#xff0c;也希望对你有帮助&#xff5e; …...

React路由(React笔记之五)

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! React路由介绍 现在前端的项目一般都是SPA单页面应用,不再是以前多个页面多套HTML代码项目了,应用内的跳转不需要刷新页面就能完成页面跳转靠的就是路由系统 R…...

调用讯飞星火API实现图像生成

目录 1. 作者介绍2. 关于理论方面的知识介绍3. 关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1 API获取3.2 代码解析与运行结果3.2.1 完整代码3.2.2 运行结果 3.3 界面的编写&#xff08;进阶&#xff09; 4. 问题分析5. 参考链接 1. 作者介绍 刘来顺&am…...

reduce过滤递归符合条件的数据

图片展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…...

Go微服务: 基于rocketmq:5.2.0搭建RocketMQ环境,以及示例参考

概述 参考最新官方文档&#xff1a;https://rocketmq.apache.org/zh/docs/quickStart/03quickstartWithDockercompose以及&#xff1a;https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard综合以上两个文档来搭建环境 搭建RocketMQ环境 1 ) 基于 docker-c…...

Wpf 使用 Prism 开发MyToDo应用程序

MyToDo 是使用 WPF &#xff0c;并且塔配Prism 框架进行开发的项目。项目中进行了前后端分离设计&#xff0c;客户端所有的数据均通过API接口获取。适合新手入门学习WPF以及Prism 框架使用。 首页统计以及点击导航到相关模块功能待办事项增删改查功能备忘录增删改查功能登录注册…...

vue-Dialog 自定义title样式

展示结果 vue代码 <el-dialog :title"title" :visible.sync"classifyOpen" width"500px" :showClose"false" class"aboutDialog"> <el-form :model"classifyForm" :rules"classifyRules">…...

数据库主键设计

文章目录 前言1. 自增ID&#xff08;Auto-Increment&#xff09;2. GUID (Globally Unique Identifier)3. 雪花算法&#xff08;Snowflake&#xff09;处理时钟回拨的方法1. 简单等待2. 配置时钟回拨安全窗口3. 使用不同的机器 ID 小结稳定的雪花算法实现方案示例实现1. 定义雪…...

小熊家务帮day13-day14 门户管理(ES搜索,Canal+MQ同步,索引同步)

目录 1 服务搜索1.1 需求分析1.2 技术方案1.2.1 使用Elasticsearch进行全文检索&#xff08;为什么数据没有那么多还要用ES&#xff1f;&#xff09;1.2.2 索引同步方案1.2.2.1 Canal介绍1.2.2.1 Canal工作原理 1 服务搜索 1.1 需求分析 服务搜索的入口有两处&#xff1a; 在…...

Android8.1高通平台修改默认输入法

需求 安卓8.1 SDK原生的输入法只能打英文, 需要替换成中文输入法. 以高通平台为例, 其它平台也适用. 查看设备当前默认输入法 adb shell settings list secure | grep input 可以看到当前默认是LatinIME这个安卓原生输入法. default_input_methodcom.android.inputmethod.l…...

49. 字母异位词分组

思路&#xff1a;题目的意思是&#xff0c;将所有字母相同的字符串放到一个数组中 解题思路是&#xff1a;使用map,使用排序好的字符串作为key&#xff0c;源字符串作为value,就可以实现所有字母相同的字符串对应一个key vector<vector<string>> groupAnagrams(ve…...

负压实验室设计建设方案

随着全球公共卫生事件的频发&#xff0c;负压实验室的设计和建设在医疗机构中的重要性日益凸显。负压实验室&#xff0c;特别是负压隔离病房&#xff0c;主要用于控制传染性疾病的扩散&#xff0c;保护医护人员和周围环境的安全。广州实验室装修公司中壹联凭借丰富的实验室装修…...

作文笔记10 复述故事

一、梳理内容&#xff08;用表格&#xff0c;示意图&#xff09; 救白蛇 得宝石 救相亲 变石头 人们纪念海力布 二、按顺序&#xff0c;不遗漏主要情节 &#xff08;猎人海力布热心救人&#xff09;救白蛇 得宝石&#xff08;白蛇强调宝石禁忌&#xff09;&#xff08;海力…...

业务安全蓝军测评标准解读—业务安全体系化

目录 1.前言 2.业务蓝军测评标准 2.1 业务安全脆弱性评分(ISVS) 2.2 ISVS评分的参考意义<...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...