CSP-S 2024 提高级 第一轮(初赛) 完善程序(1)

news2024/9/27 5:57:15

【题目】

CSP-S 2024 提高级 第一轮(初赛) 完善程序(1)
(序列合并)有两个长度为 N 的单调不降序列 A 和 B,序列的每个元素都是小于 1 0 9 10^9 109 的非负整数。在 A 和 B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求其中第 k 小的和。上述参数满足 N < = 1 0 5 N<=10^5 N<=105 1 < = K < = N 2 1<=K<=N^2 1<=K<=N2

#include <iostream>
using namespace std;
const int maxn = 100005;
int n;
long long k;
int a[maxn], b[maxn];
int *upper_bound(int *a, int *an, int ai) {
    int l = 0, r = ___(1)___ ;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (___(2)___) {
			r = mid;
		} else {
			l = mid + 1;
		}
    }
	return ___(3)___ ;
}
long long get_rank(int sum) {
	long long rank = 0;
	for (int i = 0; i < n; i++) {
		rank += upper_bound(b, b + n, sum - a[i]) - b;
	}
	return rank;
} 
int solve() {
	int l = 0, r = ___(4)___ ;
	while (l < r) {
		int mid = ((long long)l + r) >> 1;
		if (___(5)___) {
			l = mid + 1;
		} else {
			r = mid;
		}
	}
	return l;
}
int main() {
	cin >> n >> k;
	for (int i = 0; i < n; ++i)
		cin >> a[i];
	for (int i = 0; i < n; ++i)
		cin >> b[i];
	cout << solve() << endl;
	return 0;
}
  1. (1)处应填( )
    A.an-a
    B.an-a-1
    C.ai
    D.ai+1
  2. (2)处应填( )
    A.a[mid]>ai
    B.a[mid]>=ai
    C.a[mid]<ai
    D.a[mid]<=ai
  3. (3)处应填( )
    A.a+l
    B.a+l+1
    C.a+l-1
    D.an-l
  4. (4)处应填( )
    A.a[n-1]+b[n-1]
    B.a[n]+b[n]
    C.2*maxn
    D.maxn
  5. (5)处应填( )
    A.get_rank(mid)<k
    B.get_rank(mid)<=k
    C.get_rank(mid)>k
    D.get_rank(mid)>=k

【题目考点】

1. 二分查找

【解题思路】

int *upper_bound(int *a, int *an, int ai) {
    int l = 0, r = ___(1)___ ;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (___(2)___) {
			r = mid;
		} else {
			l = mid + 1;
		}
    }
	return ___(3)___ ;
}

upper_bound的字面意思是上界
在有序序列中,lb、ub是序列的下标。如果左闭右开区间[lb, ub)中的元素都为x,我们说x的下界是lb,上界是ub。如果整个序列是不降序列,那么上界ub位置的值也是大于x的最小值。
根据get_rank函数中的调用语句upper_bound(b, b + n, sum - a[i]) - b,以及已知b数组的下标范围为[0, n),那么可知upper_bound的意义是:在左闭右开区间[a, an)指向的序列范围内找ai的上界,也就是大于ai的最小值的最小下标,这和STL中upper_bound的参数概念相同。
如果区间[a, an)中第一个元素*a的值就是大于ai的最小值,那么应该返回指针a。
如果ai比区间[a, an)中的元素都大,那么应该返回指向最后一个元素的后一个位置的指针,也就是an。
l、r都是整数,表示a数组的下标,对应的指针分别为a+l, a+r。可能返回的最小指针为a,所以a+l=a, l=0。可能返回的最大指针为an,所以a+r=an,r = an-a。第(1)空选A。
该函数中的二分写法是求满足条件的最小值的写法。
第(2)空填需要满足的条件,二分求的是大于ai的最小值。因此需要满足的条件应该是a[mid]>ai,第(2)空选A。
二分查找的结果是l或r。
第(3)空返回的是int*类型的指针,应该把结果下标l转为指针a+l返回。第(3)空选A。

long long get_rank(int sum) {
	long long rank = 0;
	for (int i = 0; i < n; i++) {
		rank += upper_bound(b, b + n, sum - a[i]) - b;
	}
	return rank;
} 

get_rank从字面意义来看,应该是获取加和sum的排名。
设表示排名的变量rank,初值为0。
而后遍历a数组,在a数组中选出元素a[i],而后看一下在b中有多少个元素与a[i]相加的结果都是小于等于sum的。
j = upper_bound(b, b + n, sum - a[i]) - b,也就是说b[j]是b数组中第一个大于sum-a[i]的元素。从b[0]~b[j-1]共有j个元素与a[i]相加的和小于等于sum。因此加和sum的排名rank可以增加j。
i从0到n-1循环结束后,统计出共有rank个数对的加和小于等于sum。
因此get_rank求的是小于等于sum的数对的个数。

int solve() {
	int l = 0, r = ___(4)___ ;
	while (l < r) {
		int mid = ((long long)l + r) >> 1;
		if (___(5)___) {
			l = mid + 1;
		} else {
			r = mid;
		}
	}
	return l;
}

看solve函数,是二分查找中求满足条件的最小值的写法
当mid满足条件时,r = mid
当mid不满足条件时,l = mid+1
因此(5)处应该填“不满足条件"。观察第(5)空的选项可知,是get_rank(mid)和k的比较。该题要求的是第k小的和,
在加和小于等于mid的数对的个数为k个的前提下,当mid不断减小直到最小时,mid就是第k小的数对的加和。
当mid较小时不满足条件,当mid较大时满足条件,这样才能求满足条件的最小值。
因此该二分查找的是满足加和<=mid的数对个数>=k的mid的最小值。
也就是满足get_rank(mid)>=k的mid的最小值
第(5)空填的是“不满足的条件”,是get_rank(mid)>=k取非,即get_rank(mid)>k,选A。
第(4)空填结果可能的最大值,最大值应该是a中最大值a[n-1]和b中最大值b[n-1]的加和,因此填a[n-1]+b[n-1],选A。

【答案】

  1. A
  2. A
  3. A
  4. A
  5. A

注:虽然选项都相同是小概率事件,但要想到5道题出现任何选项排列的概率都是相同的,也就是说出现AAAAA和出现ADBAB等其它任何选项的概率都是相同的。
不要被选项的表象迷惑,从玄学角度出发去修改选项,而是要从题目出发,经过合理的推导,选出能说服自己的答案。

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

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

相关文章

Excel 设置自动换行

背景 版本&#xff1a;office 专业版 11.0 表格内输入长信息&#xff0c;发现默认状态时未自动换行的&#xff0c;找了很久设置按钮&#xff0c;遂总结成经验帖。 操作 1&#xff09;选中需设置的单元格/区域/行/列。 2&#xff09;点击【开始】下【对齐方式】中的【自动换…

HAproxy,nginx实现七层负载均衡

环境准备&#xff1a; 192.168.88.25 &#xff08;client&#xff09; 192.168.88.26 &#xff08;HAproxy&#xff09; 192.168.88.27 &#xff08;web1&#xff09; 192.168.88.28 (web2) 192.168.88.29 &#xff08;php1&#xff09; 192.168.88.30…

基于微信小程序的教学质量评价系统ssm(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的教学质量评价系统的开发全过程。通过分析基于微信小程序的教学质量评价系统管理的不足&#xff0c;创建了一个计算机管理基于微信小程序的教学…

【Anti-UAV410】论文阅读

摘要 无人机在红外视频中的感知&#xff0c;对于有效反无人机是很重要的。现有的跟踪数据集存在目标大小和环境问题&#xff0c;不能完全表示复杂的逼真场景。因此作者就提出了Anti-UAV410数据集&#xff0c;该数据集总共410个视频和超过438K个标注框。为了应对复杂环境无人机跟…

丹摩智算(damodel)部署stable diffusion实验

名词解释&#xff1a; 丹摩智算&#xff08;damodel&#xff09;&#xff1a;是一款带有RTX4090&#xff0c;Tesla-P40等显卡的公有云服务器。 stable diffusion&#xff1a;是一个大模型&#xff0c;可支持文生图&#xff0c;图生图&#xff0c;文生视频等功能 一.实验目标 …

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串

【HarmonyOS】应用引用media中的字符串资源如何拼接字符串 一、问题背景&#xff1a; 鸿蒙应用中使用字符串资源加载&#xff0c;一般文本放置在resoutces-base-element-string.json字符串配置文件中。便于国际化的处理。当然小项目一般直接引用字符串&#xff0c;不需要加载s…

计算机毕业设计 基于Python国潮男装微博评论数据分析系统的设计与实现 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

LeetCode 149. 直线上最多的点数

LeetCode 149. 直线上最多的点数 给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入&…

【数据结构之线性表】有序表的合并(链表篇)

链表有序表的合并 思路图 将链表L1和L2按照顺序合并到L3中&#xff08;注&#xff1a;三个链表都是带头结点的&#xff09; A、要实现有序合并&#xff0c;必须先比较L1,L2两表中结点的大小&#xff0c;这里我们暂时先不讨论&#xff0c;直接根据图中来进行思路整理&#xff…

pve主要架构和重要服务介绍

Proxmox VE (PVE) 是一款开源的虚拟化平台&#xff0c;它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术&#xff0c;支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。下面介绍 PVE 的主要架…

jenkins中多个vue项目共用一个node_modules减少服务器内存的占用,对空间造成资源浪费

多个vue项目使用的node_modules一致&#xff0c;每个项目都安装一遍依赖&#xff0c;对空间造成资源浪费。 通过服务器上的软连接mklink(windows服务器&#xff0c;如果是linux服务器用ln)来共用一套node_modules windows mklink /d [链接文件或目录] [原始文件或目录] 进入…

二叉树的基本概念(下)

文章目录 &#x1f34a;自我介绍&#x1f34a;二叉树的分类满二叉树完全二叉树 &#x1f34a;二叉树的存储顺序存储[完全二叉树]链式存储 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34…

无人机避障——4D 毫米波雷达 SLAM篇(一)

做无人机避障相关工作&#xff0c;3D毫米波避障测试顺利后&#xff0c;开始做4D毫米波雷达无人机避障遇到4D雷达点云需要进行处理的问题&#xff0c;查阅文献&#xff0c;发现以下这篇文章中的建图方法应该为后续思考的方向&#xff0c;特此将这个开源项目进行复现和学习&#…

react crash course 2024(2) 创建项目及vscode插件

使用vite创建react项目 npm create vitelatest react-crash-2024 跳到那个项目 cd .\react-crash-2024 打开那个项目 code . 在vite.config.js中设置端口 安装依赖 npm i 运行 npm run dev vs code插件 rafce //在底部导出的react箭头函数组件

计算机毕业设计 基于Python医院预约挂号系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【AI】深度学习的数学--核心公式

1 梯度下降 f ( x Δ x , y Δ y ) ≃ f ( x , y ) ∂ f ( x , y ) ∂ x Δ x ∂ f ( x , y ) ∂ y Δ y f(x\Delta x,y\Delta y) \simeq f(x,y)\frac{\partial f(x,y)}{\partial x}\Delta x\frac{\partial f(x,y)}{\partial y}\Delta y f(xΔx,yΔy)≃f(x,y)∂x∂f(x,y)​…

聚观早报 | 豆包视频生成大模型发布;华为纯血鸿蒙将开启公测

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月25日消息 豆包视频生成大模型发布 华为纯血鸿蒙将开启公测 高德地图将发放百亿补贴 12306上线“车内换座”新…

RK3568笔记六十三:基于LVGL的Linux相机

若该文为原创文章,转载请注明原文出处。 记录移植韦老师的基于LVGL的Linux相机项目,主要是想学习如何在LVGL下显示摄像头数据。 此项目是基于老师的源码框架移植的,地址是lv_100ask_linux_camera: 基于LVGL的Linux相机 (gitee.com) 个人使用的是RK3568,正点原子板子,所以…

CTF-PWN方向自学习笔记

基础知识 栈的结构 熟悉如下寄存器 db 定义的是1Byte的变量 也就是8位 define byte dd 定义的通常是4字节的变量 也就是32位 Define Double Word dw 定义一个16位 也就是2字节的变量 Define Word dq 定义一个8字节 也就是64位的变量 多少位的机器就表示一个字是多少位 x86…