来源:cnblogs 作者:尹昱钦 时間: 9:06:43
一年一度的“跳石头”比赛又要开始了!
这项比赛将在一条笔直的河道中进行河道中分布着一些巨大岩石。组委会已经选择好了兩块岩石作为比赛起点和终点在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)在比赛过程中,选手们将从起点出发每一步跳向相邻的岩石,直至到达终点
为了提高比赛难度,组委会计划移走一些岩石使得选手们在比赛过程中的最短跳跃距离尽可能长。由於预算限制组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。
第一行包含三个整数 L,N,M分别表示起点到终点的距離,起点和终点之间的岩石数以及组委会至多移走的岩石数。保证 L≥1且 N≥M≥0
表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小箌大的顺序给出且不会有两个岩石出现在同一个位置。
一个整数即最短跳跃距离的最大值。
首先看一下数据范围发现暴力枚举时间肯定会炸(除非你只是想拿部分分),所以这里我们要用到一个新的算法——二分答案
顾名思义,二分答案就是把一组数据每次分成两部分就是把大问题转化成小问题。例如猜数游戏猜1-100的一个数,就先猜50若小了,就猜75若大了,就猜25就这样一直猜下去,最终找到答案
而我们每一次猜的这个答案就是所求范围内的数据的中间数据,这就是二分答案这个二分的中间数据就是指要求的内容。
上文是介绍对细节的处理。
搞明白二分答案后我们就来看看这道經典题目。
一眼看到题目中的这一句话:使得选手们在比赛过程中的最短跳跃距离尽可能长当出现最小值最大或最大值最小或求最大值、最小值时,就可以考虑一下二分了
很显然,这道题我们求的是最短距离所以我们二分的就是最短距离。
首先验证答案具有单调性:拿走的石头越多最短跳跃距离越大,这就叫答案的单调性
然后进行实现。我们假设最短跳跃距离为mid那么显然0<mid<L,所以我们就先让左端點l=0右端点r=L,每次mid取中间值mid=(l+r+1)>>1这里采用的是第二种形式。接着我们写一个check函数判断一下这个mid是否合法,如果合法就尝试找一找有没有┅个值比mid更大(l=mid),如果不合法就把mid减小(r=mid-1)。
那check函数怎么写呢我们遍历一遍每一块石头,累计出有多少块石头之间的间隔<=mid,如果超过m個就不合法,如果小于等于m就合法。、