信息学奥赛初赛天天练-93-CSP-S2023阅读程序3-sort排序、同底对数求和、二分查找、二分答案

2023 CSP-S 阅读程序2

判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

01 #include <vector>
02 #include <algorithm>
03 #include <iostream>
04  
05 using namespace std;
06  
07 bool f0(vector<int> &a, int m, int k) {
08     int s = 0;
09     for (int i = 0, j = 0; i < a.size(); i++) {
10         while (a[i] - a[j] > m) j++;
11         s += i - j;
12     }
13     return s >= k;
14 }
15  
16 int f(vector<int> &a, int k) {
17     sort(a.begin(), a.end());
18  
19     int g = 0;
20     int h = a.back() - a[0];
21     while (g < h) {
22         int m = g + (h - g) / 2;
23         if (f0(a, m, k)) {
24             h = m;
25         }
26         else {
27             g = m + 1;
28         }
29     }
30  
31     return g;
32 }
33  
34 int main() {
35     int n, k;
36     cin >> n >> k;
37     vector<int> a(n, 0);
38     for (int i = 0; i < n; i++) {
39         cin >> a[i];
40     }
41     cout << f(a, k) << endl;
42     return 0;
43 }

假设输入总是合法的且 1≤ai≤10^8,n≤10000,1≤k≤n(n−1)/2,完成下面的判断题和单选题

判断题

1 将第 24 行的 m 改为 m - 1,输出有可能不变,而剩下情况为少 1( )

2 将第 22 行的 g + (h - g) / 2 改为 (h + g) >> 1,输出不变( )

3 当输入为 5 7 2 -4 5 1 -3,输出为 5 ( )

单选题

4 设 a数组中最大值减最小值加 1 为 A,则 f 函数的时间复杂度为( )
A O(nlogA)
B O(n^2logA)
C O(nlog(nA))
D O(nlogn)
5 将第 10 行中的 > 替换为 >=,那么原输出与现输出的大小关系为( )
A 一定小于
B 一定小于等于且不一定小于
C 一定大于等于且不一定大于
D 以上三种情况都不对
6 当输入为 5 8 2 -5 3 8 -12,输出为( )
A 13
B 14
C 8
D 15

2 相关知识点

1) 对数求和

同底的两个对数相加,底数不变真数相乘

例题

log4=2

log8=3

log4 + log8 = log(4*9)=log32=5

2) 二分答案

二分答案顾名思义,它用二分的方法枚举答案,并且枚举时判断这个答案是否可行

直接对答案进行枚举查找,接着判断答案是否合法。如果合法,就将答案二分进一步靠近,如果不合法,就接着二分缩小判断。这样就可以大大的减少时间。

二分中有时可以得可行得答案,但不是最大的,继续向右靠近,求出最大值

 int ans = 1;int l = 1,r = 100000;//在1~100000之间的整数枚举 while(l <= r){int m = l + (r - l) / 2;if(check(m)){//满足 则进行向右缩小范围 看看有没有更大的 ans = m;//可能多次赋值 最后一定是可能的最大值 l = m + 1;}else{//不满足缩小边长 向左缩小范围 用更小边长继续尝试 r = m - 1;} }

二分查找中间值

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

二分找边界

//左闭右闭 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;

二分查找时间复杂度

二分查找每次都缩小或扩大为原来的一半,所以也是Olog(n)

3 思路分析

假设输入总是合法的且 1≤ai≤10^8,n≤10000,1≤k≤n(n−1)/2,完成下面的判断题和单选题

判断题

1 将第 24 行的 m 改为 m - 1,输出有可能不变,而剩下情况为少 1( T )

分析

1在二分时,如果是从g=m+1找到答案的,则结果不变 - m时 不是答案 走 else m+1 为答案时
2在二分时,如果找到m为最小答案,h=m-1 ,实际结果会比答案少1如果想获取正确结果,结束条件 while (g<=h) g=h+1 即g=m+1 (把前h=m-1再加回来)
根据上述1和2,输出结果可能不变,或者比实际少1,因此正确21     while (g < h) {
22         int m = g + (h - g) / 2;
23         if (f0(a, m, k)) {
24             h = m;
25         }
26         else {
27             g = m + 1;
28         }

2 将第 22 行的 g + (h - g) / 2 改为 (h + g) >> 1,输出不变( T )

分析

g + (h - g) / 2 和 h + g) >> 1
上述取中间数的写法主要区别为第1种会避免一个数接近数据类型的范围时,两个数相加避免溢出
由于输入的1≤ai≤10^8,所以(h+g)最大2*10^8 小于整形的最大取值范围,2*10^10
所以上述改变不影响输出

3 当输入为 5 7 2 -4 5 1 -3,输出为 5 ( T )

分析

5 7
对输入的数进行排序
-4 -3 1 2 5
二分模拟
g=0,h=5-(-4)=9 m=(0+9)/2=4
-3-(-4)=1,1-(-3)=4,2-1=1,5-2=3,5-1=4 共4对,少于7,需要增大范围g=5,h=9 m=(5+9)/2=7-3-(-4)=1,1-(-3)=4,2-1=1,5-2=3, 1-(-4)=5, 2-(-4)=6,2-(-4)=6,2-(-3)=5,5-(1)=4 共9对,大于7,缩小范围,看是否有更小的满足g=5,h=7 m=(5+7)/2=6-3-(-4)=1,1-(-3)=4,2-1=1,5-2=3, 1-(-4)=5, 2-(-4)=6,2-(-4)=6,2-(-3)=5,5-(1)=4 共9对,大于7,缩小范围,看是否有更小的满足g=5,h=6 m=(5+6)/2=5-3-(-4)=1,1-(-3)=4,2-1=1,5-2=3, 1-(-4)=5, 2-(-4)=6,2-(-3)=5,5-(1)=4 共8对,大于7,此时g=h 退出循环所以输出5

单选题

4 设 a数组中最大值减最小值加 1 为 A,则 f 函数的时间复杂度为( C )
A O(nlogA)
B O(n^2logA)
C O(nlog(nA))
D O(nlogn)

分析

17     sort(a.begin(), a.end());
sort排序,时间复杂度为O(n*logn)二分为logA,每次调用f0函数,为n,所以时间复杂度为n*logAn*logn +n*logA = n(logn+logA)=nlog(nA)
所以选C
21     while (g < h) {
22         int m = g + (h - g) / 2;
23         if (f0(a, m, k)) {
24             h = m;
25         }
26         else {
27             g = m + 1;
28         }
29     }07 bool f0(vector<int> &a, int m, int k) {
08     int s = 0;
09     for (int i = 0, j = 0; i < a.size(); i++) {
10         while (a[i] - a[j] > m) j++;
11         s += i - j;
12     }
13     return s >= k;
14 }

5 将第 10 行中的 > 替换为 >=,那么原输出与现输出的大小关系为( B )
A 一定小于
B 一定小于等于且不一定小于
C 一定大于等于且不一定大于
D 以上三种情况都不对

分析

while (a[i] - a[j] > m) j++; 替换为while (a[i] - a[j] >= m) j++;
等于m的时候不被统计数量,如果正好有这个边界值,可能f0可能变成false,不能找到更小的区间,输出变大
如果没有这个边界值,对结果没有影响
所以原输出值一定小于等于现输出值

6 当输入为 5 8 2 -5 3 8 -12,输出为( B )
A 13
B 14
C 8
D 15

分析

5 8
对输入的数进行排序
-12 -5 2 3 8
二分模拟
g=0,h=8-(-12)=20 m=(0+20)/2=12
-5-(-12)=7,2-(-5)=7,3-2=1,8-3=5, 3-(-5)=8,8-2=6共6对,少于8,需要增大范围g=13,h=20 m=(13+20)/2=16
-5-(-12)=7,2-(-5)=7,3-2=1,8-3=5, 2-(-12)=14,3-(-12)=15,3-(-5)=8,8-(-5)=13,8-2=6共9对,大于8,需要缩小范围g=13,h=16 m=(13+16)/2=14
-5-(-12)=7,2-(-5)=7,3-2=1,8-3=5, 2-(-12)=14,3-(-5)=8,8-(-5)=13,8-2=6共8对,大于等于8,需要缩小范围g=13,h=14 m=(13+16)/2=13
-5-(-12)=7,2-(-5)=7,3-2=1,8-3=5,3-(-5)=8,8-(-5)=13,8-2=6共8对,小于8,此时g=13,h=14,g+1后g=h退出循环
返回g+1=14
所以选B

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

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

相关文章

半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型

半导体器件制造行业作为高科技领域的核心驱动力&#xff0c;正积极探索和实践以5G智能工厂数字孪生平台为核心的新型制造模式。这一创新不仅极大地提升了生产效率与质量&#xff0c;更为制造业的未来发展绘制了一幅智能化、网络化的宏伟蓝图。 在半导体器件制造5G智能工厂中&a…

每天五分钟计算机视觉:将人脸识别问题转换为二分类问题

本文重点 在前面的课程中,我们学习了两种人脸识别的网络模型,这两种人脸识别网络不能算是基于距离或者Triplet loss等等完成的神经网络参数的学习。我们比较熟悉的是分类任务,那么人脸识别是否可以转变为分类任务呢? 本节课程我们将介绍一种全新的方法来学习神经网络的参…

微服务架构陷阱与挑战

微服务架构6大陷阱 现在微服务的基础设施还是越来越完善了&#xff0c;现在基础设施缺乏的问题逐渐被解决了。 拆分粒度太细&#xff0c;服务关系复杂 拆分降低了服务的内部复杂度&#xff0c;但是提升了系统的外部复杂度&#xff0c;服务越多&#xff0c;服务和服务之间的连接…

java的Excel导出,数组与业务字典匹配并去掉最后一个逗号

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

Node-RED和物联网分析:实时数据处理和可视化平台

这篇论文的标题是《Node-RED and IoT Analytics: A Real-Time Data Processing and Visualization Platform》&#xff0c;发表在《Tech-Sphere Journal of Pure and Applied Sciences (TSJPAS)》2024年第一期上。论文主要探讨了Node-RED和物联网分析在物联网(IoT)实时数据处理…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

无法创建新的堆栈防护界面

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

商业实战!深入剖析StableDiffusion 电商服装模特精准替换真人,虚拟模特变现教程

大家好&#xff0c;我是灵魂画师向阳 在之前的文章中&#xff0c;我们已经深入讲解了SD与ControlNet基础知识和原理。接下来我们将结合这一堆基础工具法宝组合使用&#xff0c;完成一些有意义的AIGC商业实战案例分享。也欢迎大家在文末留言建议希望了解的实战案例。 本文是来…

在基准测试和规划测试中选Flat还是Ramp-up?

Flat测试和Ramp-up测试是各有优势的&#xff0c;下面我们就通过介绍几种实用的性能测试策略来分析这两种加压策略的着重方向。 基准测试 基准测试是一种测量和评估软件性能指标的活动&#xff0c;通过基准测试建立一个已知的性能水平&#xff08;称为基准线&#xff09;&…

计算机毕业设计 美妆神域网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

table表格,让thead固定,tbody内容滚动,关键是都对齐的纯css写法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

编程实践|用 MoonBit 实现线段树(一)

引言 线段树(Segment Tree)是一种常见的数据结构&#xff0c;用于解决一些线性区间的修改、查询问题&#xff0c;比如对于问题&#xff1a; 给出一个长度已知的、有初值的数字数组&#xff0c;接下来要进行许多区间加法操作&#xff08;将一个区间的数值都加上某个值&#xf…

线性dp 总结详解

就是感觉之前 dp 的 blog 太乱了整理一下。 LIS(最长上升子序列) 例题 给定一个整数序列&#xff0c;找到它的所有严格递增子序列中最长的序列&#xff0c;输出其长度。 思路 拿到题目&#xff0c;大家第一时间想到的应该是的暴力(dp)做法&#xff1a; #include <bits/s…

锐尔15注册机 锐尔文档扫描影像处理系统15功能介绍

锐尔文档扫描影像处理系统是一款全中文操作界面的文件、档案扫描及影像优化处理软件&#xff0c;是目前国内档案数字化行业里专业且优秀的影像优化处理软件。 无论是从纸质文件制作高质量的影像文件&#xff0c;或是检查已经制作好的影像文件&#xff0c;锐尔文档扫描影像处理…

LangChain 和 Elasticsearch 加速构建 AI 检索代理

作者&#xff1a;来自 Elastic Joe McElroy, Aditya Tripathi, Serena Chou Elastic 和 LangChain 很高兴地宣布发布新的 LangGraph 检索代理模板&#xff0c;旨在简化需要代理使用 Elasticsearch 进行代理检索的生成式人工智能 (GenAI) 代理应用程序的开发。此模板预先配置为使…

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…

使用express或koa或nginx部署history路由模式的单页面应用

使用hash模式会有#&#xff0c;影响美观&#xff0c;所以使用history模式会是个更好的选择。 前端项目打包上线部署&#xff0c;可以使用下面的方式部署history模式的项目&#xff0c;下面以 jyH5 为例 expressjs部署 express脚手架搭建的app.js中添加如下代码&#xff1a; …

Superset二次开发之优化Mixed Chart 混合图(柱状图+折线)

背景 基于Mixed Chart(柱状图+折线)作图,显示 某维度A Top10 + 其他 数据,接口返回了值为 undefined 的某维度A 数据,前端渲染成 某维度A 值为 0 此图表存在的问题: 图表控件编辑页面,即便数据集正常查询出 Top10 + ‘其他’ 数据,但是堆积图表渲染时,返回了 值为 0…

【网络通信基础与实践第四讲】用户数据报协议UDP和传输控制协议TCP

一、UDP的主要特点 1、UDP是无连接的&#xff0c;减少了开销和发送数据之前的时延 2、UDP使用尽最大努力交付&#xff0c;但是不保证可靠交付 3、UDP是面向报文的。从应用层到运输层再到IP层都只是添加一个相应的首部即可 4、UDP没有拥塞机制&#xff0c;源主机以恒定的速率…

Zookeeper安装使用教程

# 安装 官网下载安装包 #配置文件 端口默认8080&#xff0c;可能需要更改一下 #启动 cd /Users/lisongsong/software/apache-zookeeper-3.7.2-bin/bin ./zkServer.sh start #查看运行状态 ./zkServer.sh status #停止 ./zkServer.sh stop #启动客户端 ./zkCli.sh ls /