首页 > 其他分享 >二分练习plus - 二分

二分练习plus - 二分

时间:2024-12-14 09:32:09浏览次数:4  
标签:二分 right int NKOJ 练习 mid plus left

二分练习plus - 二分

二分的理论基础

二分的作用

  • Q:二分有什么作用?
  • A:二分可以在 \(O_{\log n}\) 的时间内找到特定的值。

二分的原理

  • Q:二分的原理是什么?

  • A:二分的本质是分治,把从一个大区间里找东西的问题根据找的东西的大小分成两半,只查找答案可能在的范围,不可能在的范围不管。

  • Q:时间复杂度为什么是 \(O_{\log n}\) ?

  • A:因为每次将区间缩小到原来的一半,共缩小 \(\log n\) 次到 \(1\) 。

  • Q:二分的递归写法和循环写法区别在哪里?

  • A:二分的递归写法如下:

    void bs(int left,int right,int t){
        int mid=left+right>>1;
        if(left>right) return;
    //	if(arr[mid]==t) return; //用于找第一个出现的
        if(arr[mid]<t) bs(mid+1,right,t);
        else bs(left,mid-1,t);
    }
    

    循环写法如下:

    void bs(int l,int r,int t){
    	int left=l,right=r;
        while(left<=right){
        	int mid=left+right>>1;
            if(arr[mid]==t) return;
            if(arr[mid]<t) left=mid+1;
            else right=mid-1;
        }
    }
    

    它们之间的区别在于,循环写法更简单好写,递归容易死递归、爆栈等,所以用循环而一般不用递归。

  • Q:找第一个大于等于某个数的值和找最后一个小于等于某个数的值,有什么区别?

  • A:

    • 在二分时,一个是答案符合要求先保留,看能不能更大,另一个是看能不能更小。
    • 找最后一个小于等于某个数的值时,要注意 mid 向上取整,不然分得不够均匀会死循环。

二分的注意事项

  1. 使用二分时务必保证数据满足单调性。
  2. 注意实数二分时要设置 eps 因为 leftright 一般不会相遇。
  3. 注意 mid 的不同写法一般是 mid=left+right>>1 在实数中是 mid=(left+right)/2.0 如果有越界风险可以写 (left>>1)+(right>>1)

NKOJ 1190 何老板的淘宝店2.0

思路:二分模板

实现方法:

  • lower_bound(arr+1,arr+1+n,需要查找的数)

NKOJ 1048 【分类练习4.分治法】求方程的根

思路:用二分求方程的解。

实现方法:

  • 在实数中二分方程的解。
  • 如果满足方程,输出。

注意事项:

  1. 开始时注意判断是不是 NO

NKOJ 3592 人数统计

法一

思路:map
实现方法:
  • 把每个 \(k\) 都用 map 记录下来。
  • 问什么输出什么。

法二

思路:二分。
实现方法:
  • 先给数组排序。
  • 每个询问搜第一个大于 \(x\) 的值,和最后一个小于等于 \(x\) 的值,然后做差。

NKOJ 3593 工资统计

与NKOJ 3592完全相同。

NKOJ 1934 外地人

法一

思路:map
实现方法:
  • 把每个字符串都用 map 记录下来。
  • 问什么输出什么。

法二

思路:二分。
实现方法:
  • 先给按字典序排序。
  • 每个询问用二分询问的字符串,输出对应的字符串。

注意事项:在用字符串 cin 时,一定要加 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)


NKOJ 3144 何老板的淘宝店3.0

思路:找数,如果没有就是第一个大于等于它的和最后一个小于等于它的比较,谁接近用谁

二分答案

二分答案的使用场景

  • Q:为什们要用二分答案?
  • A:因为有的题目中,答案不能通过贪心直接计算,而需要循环枚举检查其是否可行,循环速度很慢,所以使用二分。

check 函数怎么写

  • Q:check 函数的实现思路是什么?
  • A:根据你二分的答案,带入题目场景中,检查符不符合题目给定的限制。注意:答案是不是最大 / 最小不是 check 函数检查的地方

NKOJ 3145 洗衣服

思路:二分答案

实现方法:

  • 二分所需的最少时间。
  • check 函数:如果规定时间内能自然烘干就跳过,否则就给计数变量加上当前衣服用散热器烘的时间。

注意事项:

  1. 注意在开始时将 k 减 \(1\) 。

课件例题 砍甘蔗

思路:二分答案

实现方法:

  • 二分最长的甘蔗最短的长度。
  • check 函数:从头开一段新的,只要大于要求的甘蔗长度就新开一段,检查 \(m\) 段能不能装完。

NKOJ 1192 收入计划

与上题完全相同。


NKOJ 1007 书的复制

思路:与砍甘蔗相同,考虑如何输出。

实现方法:

  • 先采用砍甘蔗测略,找到最大的最小是多少。
  • 然后用一次 check 函数的代码,把详细的段分出来。
  • 注意:题目中说了如果有多解,要让前面的人抄的尽量少 所以需要调整策略。
    • 把整个数组翻转。
    • 输出 \(i\) 时,全部输出 \(n-i+1\) 。
    • 从小到大输出。

洛谷 1824 进击的奶牛

思路:类似于砍甘蔗,区别在于一个是最大的最小,一个是最小的最大。

实现方法:

  • 调整二分,将其改为求最小的最大。
  • check 函数完全相同。

二分小技巧

  • 一般题目中说到 “最大 / 小值最小 / 大”,可以考虑二分答案。
  • 一般题目如果是二分答案,就问什么二分什么。

标签:二分,right,int,NKOJ,练习,mid,plus,left
From: https://www.cnblogs.com/hsr-ray-blog/p/18606365

相关文章

  • Java方法调用经典题目练习
    一.简答题(共15题,100.0分)1.编写一个方法,返回两个参数的和。提示:方法的原型如下:doublesum(doublex,doubley)(5.0分)2.编写一个方法,返回三个参数中的最大值。提示:方法的原型如下:doublemax(doublex,doubley,doublez)(5.0分)3.编写一个方法,判断参数是否是奇......
  • 【模板】二分图最大匹配
    洛谷P3386思路使用匈牙利算法解决二分图最大匹配问题。这道题就是匈牙利算法的模板题。代码#include<bits/stdc++.h>#pragmaG++optimize(2)#pragmaG++optimize("inline")usingnamespacestd;intn,m,g,id,ans,h[505],match[505];boolvis[505];structq{ intto,......
  • 【 C语言练习(7)—递归法反向打印字符串】
    C语言练习(7)文章目录C语言练习(7)前言问题问题分析结果总结前言进一步练习和巩固递归函数构建思想问题使用递归的方法给定一个字符串abcde,反向输出edcba问题分析对于字符串的输入和输出使用getchar()和putchar(),如下面程序所示;首先要写递归函数,递归函数原理......
  • Vue3+ElementPlus 中 el-image 预览大图属性 previewSrcList 和 translateY(-5px) 的
    【前言】Vue3使用ElementPlus,Vue2使用Element-ui。【问题描述】在Vue3+ElementPlus中,使用el-image和预览大图功能,点击el-image后预览的图片局限在原有图片(小图)内,遮罩也没有充满屏幕。【注】使用  transform:translateY(-5px); 的原因是本来外面有一层div,想用hover ......
  • 50个Excel函数以及公式合集,可收藏练习!(二)
    大家好,我是小鱼。接上一篇的20个超强常用函数,这次又补充了50个常用的函数,掌握这些函数以后再也不用为不会函数效率低发愁了! 希望这篇文章能对你有所帮助。点赞收藏不迷路呦!......
  • Java练习_时间加法与时间减法
    时间加法问题描述在程序中,经常要对时间进行操作,请定义实现一个时间类,来满足程序中的需要:(1)定义名为MyTime的类,其中应有三个整型成员:时(hour),分(minute),秒(second)。(2)为了保证数据的安全性,这三个成员变量应声明为私有。(3)为MyTime类定义构造方法,以方便创建对象时初始化成员变量。(4)为M......
  • Springboot+maven+druid+mybatis-plus多数据源
    Springboot版本:2.3.12.RELEASE1.maven依赖<!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22&l......
  • 练习 -- 第八章
    练习8.1编写函数,接受一个istream&参数,返回值类型也是istream&。此函数须从给定流中读取数据,直至遇到文件结束标识时停止。它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。练习8.2测试函数,调用参数为cin。练习8.3什么情况下,下面的......
  • 帮助用户与 AI 实时练习口语,Speak 为何能估值 10 亿美元?丨Voice Agent 学习笔记
     ......
  • 知攻善防应急响应靶场练习-web1
    题目描述前景需要:小李在值守的过程中,发现有[CPU](https://so.csdn.net/so/search?q=CPU&spm=1001.2101.3001.7020)占用飙升,出于胆子小,就立刻将服务器关机,这是他的服务器系统,请你找出以下内容,并作为通关条件:1.攻击者的shell密码2.攻击者的IP地址3.攻击者的隐藏账户名称4.攻......