题目描述:
一年一度的“跳石头”比赛又要开始了!
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 𝑁N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 𝑀M 块岩石(不能移走起点和终点的岩石)。
代码:
package lanqiao;
import java.util.*;
public class Main {
static int L,N,M;
static int[] a = new int[50010];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
L = sc.nextInt(); //距离
N = sc.nextInt(); //岩石数
M = sc.nextInt(); //最多移走的岩石数
a[0] = 0;a[N + 1] = L;
for(int i = 1;i <= N;i ++)
{
a[i] = sc.nextInt();
}
int l = 0,r = L;
while(l < r)
{
int mid = (l + r + 1)/2;
if(judge(mid))
{
l = mid;
}else{
r = mid - 1;
}
}
System.out.println(l);
}
public static boolean judge(int s)
{
int now = 0;
int cnt = 0;
for(int i = 1;i <=N + 1;i ++) //扫描整个数组,距离小于目前值,取石头然后计数
{
if(a[i] - a[now] < s){
cnt ++;
}else{
now = i;
}
}
if(cnt > M)
{
return false;
}
else{
return true;
}
}
}