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

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

时间:2024-09-01 11:25:04浏览次数:3  
标签:二分 count NOIP2015 mid 初赛 处应 rbound lbound

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;

标签:二分,count,NOIP2015,mid,初赛,处应,rbound,lbound
From: https://www.cnblogs.com/myeln/p/18391125

相关文章

  • 学习笔记(?):一类查询 kth 的整体二分 trick
    问题大概就是有若干次修改(也有可能没有)和若干次查询,查询形如查某个范围的kth。做法是,把可能成为答案的候选集合按照权值大小排序。询问集合可以不用管顺序。然后开始二分。我们令solve(l,r,L,R)表示第\(l\)到\(r\)个询问的kth一定在候选序列的第\(L\)到\(R\)个数。......
  • NC 二分查找-II
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。描述请实现有重复数字的升序数组的二分查找给定一个元素有序的(升序)长......
  • 信息学奥赛初赛天天练-80-NOIP2015普及组-基础题5-错位排列、二叉树、完全二叉树、叶
    NOIP2015普及组基础题521重新排列1234使得每一个数字都不在原来的位置上,一共有()种排法22一棵结点数为2015的二叉树最多有()个叶子结点2相关知识点1)错位排列考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就......
  • [Python手撕]二分法
    二分法二分法的几个位置比如01234567891233333456有时候想要寻找小于3的最大数字有时候想要寻找第一个满足>=3的数字,有时候想要寻找最后一个满足>=3的数字,有时候想要寻找小于4的最大数字nums=[1,2,3,4,5,5,5,5,5,6,7,8,9]n=......
  • CSP-J 2020 初赛试题解析(第一部分:单项选择题(5-10))
    ......
  • F. Final Boss(二分,周期)
    题目来源:https://codeforces.com/contest/1985/problem/F//题意:你有n种攻击,每种攻击有周期和攻击力,如果当前回合是x,以为着第i种攻击,下次攻击是x+ci回合。现在有Boss,生命值为h,当h<=0的时候,Boss死亡。一开始所有攻击都没有冷却时间,问最少第几回合Boss死亡。//思路:“最开始无脑模......
  • 二分法查+范围内临近值查找
        1uint16FindPosition(uint8arr[],uint16length,uint8target)2{3uint16low=0;4uint16high=length-1;5uint16closest_position=0xFFFF;67if(target<arr[0]||target>arr[length-1])8{9......
  • CSP-J 2021 初赛试题解析(第三部分:完善程序(2))
    完善程序二完整程序代码#include<iostream>usingnamespacestd;structpoint{intx,y,id;};boolequals(pointa,pointb){returna.x==b.x&&a.y==b.y;}boolcmp(pointa,pointb){returna.x!=b.x?a.x<b.x:a.y<b.y;}......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划
    洛谷P2680[NOIP2015提高组]运输计划题意给出一棵树和\(m\)条路径,可以选择一条边,把边权改为\(0\),求\(m\)条路经长度最大值的最小值。思路看到最大值最小,可以想到二分答案,答案具有单调性。考虑如何判定答案\(x\)是否可行。统计所有长度大于\(x\)的路径,统计它们共......
  • 代码随想录算法训练营,29日 | 704. 二分查找,27. 移除元素,977.有序数组的平方,209.长度最
    数组基础文档讲解︰代码随想录(programmercarl.com)1.连续空间、相同类型元素2.元素只能覆盖3.二维数组的地址连续吗(C++连续,Java不连续)704.二分查找题目链接:704.二分查找文档讲解︰代码随想录(programmercarl.com)视频讲解︰二分查找日期:2024-08-29思路:第一反应是想到二分查......