首先让我们先学一下二分答案这个东西...

 

二分答案,肯定与二分有关,还与可能是答案的东西有关...

二分答案的准确定义:

二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转化为验证结果。

 

大体流程:

首先需要估计答案的上下界,然后不断取区间中点进行验证(这就要求答案的验证应当简单可行),并通过验证结果不断更新答案区间,最终得到答案。不难看出,朴素的枚举验证时间复杂度是O(n)的,而二分可以做到O(logn)

 

二分答案的特征:

1.答案具有单调性

2.二分答案的问题往往有固定的问法,比如:令最大值最小(最小值最大),求满足条件的最大(小)值等。

 

二分答案的写法:

1.在单调递增序列a中查找 >= x 的数中最小的一个(即x 或 x的后继):

 while (l < r) {
int mid = (l + r) >> ;
if (a[mid] >= x) r = mid;
else l = mid + ;
}
return a[l];

后继

2.在单调递增序列a中查找 <= x 的数中最大的一个(即x 或 x的前驱):

 while (l < r) {
int mid = (l + r + ) >> ;
if (a[mid] <= x) l = mid;
else r = mid - ;
}
return a[l];

前驱

关于这两段代码的解释(见下图):

下面这是一个二分答案的模板题(2019 pdoi T3):

https://www.luogu.org/problemnew/show/P2678


这是一个二分答案的模板,然后二分答案的题的细节实在是太多了!!!(然后就一直wa ,无法列举..

(在不知道有二分答案这个东西之前发现自己的思路完全与其相反,自己只是暴力地解出答案,而不是二分枚举答案

二分答案的核心上面也都讲了,下面直接是AC代码外加部分细节解释:

 #include <cstdio>

 inline int get_num(){
int num = ;
char c = getchar();
while (c < '' || c > '') c = getchar();
while (c >= '' && c <= '')
num = num * + c - '', c = getchar();
return num;
}//快读 const int maxn = 5e4 + ; int stone[maxn], n, m, L; inline int check(int x){
int cnt = , last = ;
for(int i = ; i <= n; i++){
if(stone[i] - stone[last] < x) cnt++;
//留着这块石头发现最短路径小于mid,则要删去
else last = i;//留着则更新上一块石头坐标
}
if(cnt <= m) return ;//是否合法
else return ;
}//检查是否合法 int main(){
L = get_num(), n = get_num(), m = get_num();
for(int i = ; i <= n; i++) stone[i] = get_num();
int l = , r = L;//@1
while(l < r){
int mid = (l + r + ) >> ;//@2
if(check(mid)) l = mid;
else r = mid - ;
}//二分答案的核心
printf("%d", l);
return ;
}

AC代码

解释:

@1:将r先设到不可能越界的一个位置,然后再进行二分,保证答案在[L,R]这个区间中

@2:>>1 和 / 2 都是除以二,但是 >> 1 是向下取整, / 2是向零取整,为了避免二分答案中出现负数。这行如果写成这种形式,那么r就直接赋值为L,不要赋值L+1

二分答案 & 洛谷 P2678 跳石头的更多相关文章

  1. [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)

    [NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...

  2. 洛谷 P2678 跳石头

    题目背景 一年一度的"跳石头"比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间 ...

  3. 洛谷 P2678 跳石头【经典二分答案/贪心】

    题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石).在比赛过程中,选手们将从 ...

  4. [NOIP2015] 提高组 洛谷P2678 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...

  5. 洛谷P2678跳石头题解

    题目 这个题也是一个很经典的题了.其主要思想也是二分答案,原因就是题目中只要出现最大值最小或最小值最大,这种描述十有八九就是二分答案. 这个题原题也是让我们求最短的跳跃距离的最大值. 显而易见,最大值 ...

  6. 【【洛谷P2678 跳石头】——%%%ShawnZhou大佬】

    {dalao传送门} 这道题如果要使用暴力搜索直接求解会严重超时.实际上,我们可以发现,这个所谓的最短跳跃距离显然不能超过一个范围,而这个范围题目上已经给了出来.也就是说,答案是有一个确定的范围限制的 ...

  7. 洛谷P2678跳石头(提高)

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点. 在起点和终点之间,有 N 块岩石( ...

  8. 洛谷 p2678 跳石头 题解

    一道裸的二分答案 如果不会分治的去找dalao吧,本蒟蒻只会二分 不知道二分答案的看这里 这位dalao解释的很详细其实只是随便找了一个 那里面貌似也有这个题的题解,但我还是要写(才不是应付老师) 关 ...

  9. 洛谷P2678 跳石头

    简简单单二分答案,n和m不要写反 Code: #include<cstdio> #include<algorithm> using namespace std; const i ...

随机推荐

  1. 在ubuntu中编译内核是用make&nbsp;…

    执行过程如下: root@zyx-VirtualBox:~# cd /opt/EmbedSky/ root@zyx-VirtualBox:/opt/EmbedSky# cd linux-2.6.30. ...

  2. oscache.properties文件配置

    1.cache.memory是否使用内存缓存:值为:true或false.默认为true:如设置为false,那cache只能缓存到数据库或硬盘中. 2.cache.capacity缓存的最大数量.默 ...

  3. python中descriptor的应用

    [python中descriptor的应用] 1.classmethod. 1)classmethod的应用. 2)classmethod原理. 2.staticmethod. 1)staticmet ...

  4. codeforce453DIV2——D. GCD of Polynomials

    题意 给出n(1–150). 输出两个多项式A,B从常数到最高次的系数,使得对两个多项式求gcd时,恰好经过n步得到结果. 多项式的gcd一步是指(A(x),B(x))变成(B,A mod B)的过程 ...

  5. 算法描述》LCA两三事(蒟蒻向)

    LCA是图论中常用的解决树形结构子问题的工具,这一问题一般需要用一个简短的子函数直接解决,但是这对于广大蒟蒻们仍然是一个不小的问题. LCA是指在树形结构中两点的最近公共祖先,对于这个问题,直接向上找 ...

  6. nohup 无发后台运行

      用nohup命令让Linux下程序永远在后台执行 [ 2006-5-13 22:31:54 | By: 牧云 ]   Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在 ...

  7. Linux编译提速

    一.简介 项目越来越大,重新编译整个项目是一件很费时的事,总结可以帮助提速方法,如下: 1)tmpfs: 解决IO瓶颈,充分利用本机内存资源 2)make -j: 充分利用本机计算资源 3)distc ...

  8. Cunit编译安装

    1.  Examples/Makefile.am:26: to 'configure.ac' and run 'autoconf' again. configure.ac:211: error: re ...

  9. Cookie存中文乱码的问题

    有个奇怪的问题:登录页面中使用Cookie存值,Cookie中要存中文汉字.代码在本地调试,一切OK,汉字也能顺利存到Cookie和从Cookie中读出,但是放到服务器上不管用了,好好的汉字成了乱码, ...

  10. Jlabel实现内容自动换行

    Jlabel实现内容自动换行 摘自:https://blog.csdn.net/zhhtao89/article/details/50179695   2015年12月04日 21:09:27 阅读数 ...