浅谈二分答案的原理和相关应用

一、二分答案的原理和过程

1.适用范围:

当一个问题的解满足单调性(结果与询问数值成正相关或负相关)且待枚举数量,出现“最大值最小”或“最小值最大”等时,我们可以对答案进行二分;

2.原理:

1.在二分答案前,找出答案所在区间,即[L,R];

2.用valid函数验证当前值的可行性;

3.迭代求解的过程中,每次计算一个mid=(L+R)/2,若valid(mid)==true时,根据单调性,选择更接近于不可能的一半区间,反之取另一半区间;

3.代码实现(以求最大值最小为例)

while ( l < r ) {
    mid = ( l + r ) / 2;
    if ( valid ( mid ) ) l = mid+1;
    else r=mid;
}

while ( l < r ) {
    mid = ( l + r + 1 ) / 2;
    if ( valid ( mid ) ) l = mid;
    else r=mid-1;
}

4.边界问题

1.在第一种实现方式中,如果l和r为相邻的一奇一偶,则每次mid计算后都等于l,如果每次只是让l=mid或r=mid的话,会出现死循环,所以应让l=mid+1;

2.在第二种实现方式中,如果l和r为相邻的一奇一偶,则每次mid计算后都等于r,如果每次只是让l=mid或r=mid的话,会出现死循环,所以应让r=mid-1;

5.优点

1.在时间复杂度上,枚举验证从O(N)优化到O(log N);

2.在思考难度上,寻找解总是比验证解更难(NP和P的关系),所以二分答案的思考过程非常简单;

二、相关问题

1.[NOIP2015提高&洛谷P2678]跳石头

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543415.html

2.[NOIP提高&洛谷P1024]一元三次方程求解

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543377.html

3.[NOIP2012提高&洛谷P1083]借教室

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8467795.html

3.[CodePlus 2017 11月赛&洛谷P4058]木材

题解随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543473.html

原文地址:https://www.cnblogs.com/COLIN-LIGHTNING/p/8543330.html

时间: 2024-11-13 11:08:31

浅谈二分答案的原理和相关应用的相关文章

浅谈二分和二分答案

一般来讲我们会在以下情况用到二分: 求单调函数的零点 求一堆东西的最小值最大是多少 很难直接算出答案,但是很好判定答案合不合法 如果想学就继续看吧! 二分查找 二分是一种可以再\(\mathcal{O}(\mathrm{ch}\log m)\)(\(m\)为数据规模,\(\mathrm{ch}\)为判断状态合法性check()函数时间复杂度)时间复杂度内求解问题的方法,主要是一个分治,每次将搜索范围减半. 我们以二分查找引入. 有一个有序序列,二分查找的思想如下: 1.定义L,R,mid代表答案

[转自SA]浅谈nginx的工作原理和使用

nginx apache 简单对比 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单 社区活跃 配置简洁 apache 相对nginx 的优点: rewrite ,比 nginx 的 rewrite 强大 模块超多 少 bug ,nginx 的 bug 相对较多 超稳定 配置复杂

TODO:浅谈pm2基本工作原理

要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦),他是反叛上帝耶和华的堕天使(Fallen Angels),曾经是上帝座前的天使,后来他因骄傲自大妄想与神同等而堕落成为魔鬼,被看作与上帝的力量相对的邪恶.黑暗之源. 简单的说Satan是破坏神,就是进程的异常退出.kill等:God是守护神,保护进程.重启进程等. 一图胜千言,pm2的 RPC基本框架.Client与Daemon是采用了R

JAVA NIO之浅谈内存映射文件原理与DirectMemory

Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数  read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有

浅谈二分

太极生两仪,两仪生四象,四象生八卦,阴阳交媾万物生. 若要你在全校同学当中猜我心里想的那个人,允许你问若干个问题,使问问题次数尽量少,你肯定会问我那个人是男生还是女生.因为这样,可以筛掉一半的人.并且在数学期望上来说,你肯定会尽量问一些能筛掉一半的问题,将问题的答案集合一分为二.假设你直接问是不是***,我说不是的话,你这个问题就问得十分无力了,因为它只帮你排除了一个人.所以,每次问可以筛掉一半备选集合的问题,显然是一种很聪明的做法. 世间万物始于混沌,根据太极生两仪,两仪生四象,四象生八卦,我

浅谈JavaScript DDOS 攻击原理与防御

前言 DDoS(又名"分布式拒绝服务")攻击历史由来已久,但却被黑客广泛应用.我们可以这样定义典型的DDoS攻击:攻击者指使大量主机向服务器发送数据,直到超出处理能力进而无暇处理正常用户的合法请求,最终导致用户无法正常访问网站. 近年来,DDoS攻击手段已日趋多元化——攻击者通过各种奇技淫巧诱使不知情主机参加攻击.比如,[注1]历史上数据量最大(超过400Gbps)的DDoS攻击就是通过[注2]NTP反射完成的.时至今日,我们已经发现一个令人不安的趋势:攻击者通过恶意的JavaScri

浅谈二分查找

定义 In computer science, binary search, also known as half-interval search, logarithmic search, or binary chop, is a search algorithm that finds the position of a target value within a sorted array. Binary search compares the target value to the middl

浅谈HashMap 的底层原理

本文整理自漫画:什么是HashMap? -小灰的文章 .已获得作者授权. HashMap 是一个用于存储Key-Value 键值对的集合,每一个键值对也叫做Entry.这些个Entry 分散存储在一个数组当中,这个数组就是HashMap 的主干. HashMap 数组每一个元素的初始值都是Null. 1. Put 方法的原理 调用Put方法的时候发生了什么呢? 比如调用 hashMap.put("apple", 0) ,插入一个Key为"apple"的元素.这时候我

浅谈差分数组的原理及简单应用

一.差分数组的定义及用途 1.定义: 对于已知有n个元素的离线数列d,我们可以建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]. 2.简单性质: (1)计算数列各项的值:观察d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2]可知,数列第i项的值是可以用差分数组的前i项的和计算的,即d[i]=f[i]的前缀和. (2)计算数列每一项的前缀和:第i项的前缀和即为数列前i项的和,那么推导可知