信息学奥赛初赛天天练-81-NOIP2015普及组-完善程序-二分答案、二分查找、中位数、二分边界、二分时间复杂度

news/2024/11/16 13:25:38/文章来源:https://www.cnblogs.com/myeln/p/18391125

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

中位数 median

给定 n(n为奇数且小于 1000)个整数,整数的范围在 0∼m(0<m<2^31) 之间,请使用二分法求这 n个整数的中位数。所谓中位数,是指将这 n个数排序之后,排在正中间的数。(第五空 2 分,其余 3 分)

01 #include <iostream>
02 using namespace std;
03 
04 const int MAXN = 1000;
05 int n, i, lbound, rbound, mid, m, count;
06 int x[MAXN];
07 
08 int main()
09 {
10     cin >> n >> m;
11     for (i = 0; i < n; i++)
12         cin >> x[i];
13     lbound = 0;
14     rbound = m;
15     while (①)
16     {
17         mid = (lbound + rbound) / 2;
18         ②;
19         for (i = 0; i < n; i++)
20             if (③)
21                 ④;
22         if (count > n / 2)
23             lbound = mid + 1;
24         else
25             ⑤;
26         cout << mid << " " << lbound << " " << rbound << " " << count << endl;
27     }
28     cout << rbound << endl;
29     return (0);
30 }

1 ①处应填( )

2 ②处应填( )

3 ③处应填( )

4 ④处应填( )

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;} }

二分找边界

//左闭右闭 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 在0~m范围内,二分枚举,把原来n个数分成2部分

2 统计其中一部分的个数,本题统计大于mid数的个数,计入变量count

3 如果count>n/2 ,即count大于n的一半,向右缩小范围,下次计算让count变小

4 否则 如果count<=n/2 ,向左缩小范围,下次计算让count变大一些

5 上面3和4步骤的目标是让count=n/2,找到最中间的数

1 ①处应填( lbound < rbound )

分析

根据
//左闭右闭 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;此处依赖第5题
由于lbound = mid + 1; 是左闭区间
由于第5题填rbound=mid; 是右开区间,所以 lbound  < rbound 
第5题填rbound=mid;的原因,请参考第5题解析
22         if (count > n / 2)
23             lbound = mid + 1;
24         else
25             ⑤;

2 ②处应填( count=0 )

分析

每次二分后,需要重新计算大于mid的数的个数,所以需要先对count初始0
不初始0的话,上次二分的计算结果会对本次产生影响,count值不对

3 ③处应填( x[i]>mid )

分析

循环统计大于mid的数个数,如果x[i]>mid ,count累加,count++
19         for (i = 0; i < n; i++)
20             if (③)
21                 ④;

4 ④处应填( count++ )

分析

参考第3填

5 ⑤处应填( rbound )

分析

由于输出结果是rbound,count=n/2在rbound这里赋值
rbound=mid;此时计算出来mid是要找的中位数,如果rbound=mid-1的话,rbound会比实际答案小1
22         if (count > n / 2)
23             lbound = mid + 1;
24         else
25             ⑤;28     cout << rbound << endl;

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

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

相关文章

Mac版Sourcetree暂存代码和取出代码

实际开发中经常遇到开发一半,要拉代码或者切分支的情况,这时候开发一半的代码如果不提交或者删除重置是无法拉取和切换分支的,那么这个时候可以把这部分代码暂存起来,然后在想取出的时候取出就行了 1.点击暂存文件,如下图2.点击贮藏,然后输入一个标识3.此时就可以正常拉取…

WPF Material Design中资源的查找和使用

Material Design中,一共分为两大块。一个是颜色资源,一个是控件资源。 下面来说下,如何使用控件资源: 在VS中,通过Nuget添加完Material Design 后,还需要在App.xaml中引用这些资源, 引用的方法如下图所示:在1处,引入material design的引用。 在2处,可以修改项目的主题…

对称二叉树-101

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。解题思路 这里我们相当于是比较根节点左右两颗子树,我们依次向左右子树的左右两个方向进行遍历,我们比较左子树的左孩子和右子树的右孩子,左子树的右孩子和右子树的左孩子,这里如果不好理解可以看下面这个图片,…

数组更加深入的学习

1.浅了解java数组原理 可以形象的认为java中有“栈”和“堆”这两个东西,栈用于存放声明的数组,而堆则用于存放数组的赋值 刚声明完的数组没有任何作用,必须要对其赋值才有意义2.数组的三种初始化静态初始化:将数组的值在声明时提前写好并且值固定不变 动态初始化:声明并创…

vue学习---vue内置组件---keep-alive

什么是keep-alive?​ keep-alive是vue的一个 内置组件,能将不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实 DOM 中。keep-alive主要用于保存组件的渲染状态,避免组件反复创建和渲染,有效提升系统性能。keep-alive核心LRU算法 LRU(…

【闲话】OI计划

教练让的。顺手水一期闲话嘻嘻分数目标 1.1 初赛:S组60 1.2 复赛:S组150+ 1.3 NOIP:150+规划 2.1 9.1~9.10:复习图论,做完最短路题单 2.2 9.10~9.20:复习组合数学和代码阅读 2.3 9.22~10.25:学习数论、复习线段树等常用模板 2.4 10.27~11.29:总复习,背诵《骗分导论》(…

C# 定时器 Timer 如何精确到 1-2 毫秒以内

最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。这让我第一时间想到了C#的定时器。由于我们项目用到的框架是基于.NETFramwork4.8的,所以我就建立了一个.NETFramwork4.8的WPF Demo…

浅谈 Occupancy

01 研究意义 Occupancy Network算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。 Occupancy Network算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法…

BEVFormer开源算法逐行解析(一):Encoder部分

写在前面: 对于BEVFormer算法框架的整体理解,大家可以找到大量的资料参考,但是对于算法代码的解读缺乏详实的资料。因此,本系列的目的是结合代码实现细节、在tensor维度的变换中帮助读者对算法能有更直观的认识。 本系列我们将对BEVFormer公版代码(开源算法)进行逐行解析…

手把手教你利用算法工具链训练、量化、编译、可视化征程 6 参考算法 BEVFormer

​ 作者:杨一飞 写在前面:关于OE包内参考算法的使用,地平线已经释放了大量文档指导用户完成各类模型的训练、校准、量化、定点过程,但其中有些细节可能会对不是特别熟悉算法工具链的客户造成困扰,本文档致力于消除参考算法使用过程中所有可能存在的模糊操作,引导初学者快…

MySQL的索引原理及使用

B+树的最底层叶子节点包含了所有的索引项。从图上可以看到,B+树在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系,但是从另一方面来说,由于数据都被放…

first-blog

各位师傅好,这里是saga131的博客 原本打算第一个博客就介绍一下自己,在github上搭建了一个博客,但是遇到了点环境问题,便转战至博客园,用第二个博客来介绍一下自己本人是从2023年10月入门CTF和取证。社团纳新面试中,我选择了密码方向,开始了crypto之路。面试结束后,CPP…