求最短跳跃距离的最大值
这是一道很好玩的题。
题目描述
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 $N$ 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 $M$ 块岩石(不能移走起点和终点的岩石)。
输入格式
第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L ≥ 1 且 N ≥ M ≥ 0。接下来 N 行,每行一个整数,第 i 行的整数 Di (0 < Di < L), 表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出格式
一个整数,即最短跳跃距离的最大值。
样例
输入
1 | 25 5 2 |
输出
1 | 4 |
算法描述
这道题,暴力枚举肯定能解决,但加上了最大移动石块数使得种类特别多,暴力枚举运行时间会很长。所以这道题还是需要进行算法优化的。
这道题我们使用二分搜索。
找到一个距离 mid ,从头开始跳石头。如果跳跃距离小于 mid ,说明当前距离不是最小值。那我们要移动石头,直到找到大于 mid 的距离。如果这个时候移动石头数小于要求数,那么我们选定的距离是当前情况下跳跃距离最小值中的最大值。如果移动石头数超过了要求数,说明在满足移动石头的条件下,当前情况有更小的距离。那么我们选择的 mid 就并不是最小值了。我们选择二分法来逼近。
代码
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.