B 市和 T 市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。
现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。
第 1 1 1 行包括三个数 L , N , K L,N,K L,N,K,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量。
第 2 2 2 行包括递增排列的 N N N 个整数,分别表示原有的 N N N 个路标的位置。路标的位置用距起点的距离表示,且一定位于区间 [ 0 , L ] [0,L] [0,L] 内。
输出 1 1 1 行,包含一个整数,表示增设路标后能达到的最小“空旷指数”值。
101 2 1
0 101
51
公路原来只在起点和终点处有两个路标,现在允许新增一个路标,应该把新路标设在距起点 50 50 50 或 51 51 51 个单位距离处,这样能达到最小的空旷指数 51 51 51。
50 % 50\% 50% 的数据中, 2 ≤ N ≤ 100 2 \leq N \leq 100 2≤N≤100, 0 ≤ K ≤ 100 0 \leq K \leq 100 0≤K≤100。
100 % 100\% 100% 的数据中, 2 ≤ N ≤ 100000 2 \leq N \leq 100000 2≤N≤100000, 0 ≤ K ≤ 100000 0 \leq K \leq100000 0≤K≤100000。
100 % 100\% 100% 的数据中, 0 < L ≤ 10000000 0 < L \leq 10000000 0<L≤10000000。
定义了两个指针 l 和 r,它们用于二分查找可能的最小空旷指数。
设置了初始答案 ans 为 r,r 初始值为 1,代表最小可能的空旷指数。
使用数组 p[] 记录相邻路标之间的距离,并更新 r 为最大的距离。
二分查找:
在每一次循环中,计算 mid 作为当前可能的最小空旷指数。
遍历相邻路标,计算出插入新路标的数量 cnt,使得相邻路标之间的距离不大于 mid。
如果 cnt 小于等于 k,说明当前 mid 是可行的,更新 ans 为 mid 并调整 r,减小搜索空间。否则,调整 l,增加 mid,继续搜索。
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int L = sc.nextInt();
int n = sc.nextInt();int k = sc.nextInt();
int [] a = new int [n+10];
int [] p = new int [n+10];
int l = 1;int r = 1;
a[0] = sc.nextInt();
for(int i = 1;i < n;i++) {
a[i] = sc.nextInt();
p[i] = a[i]-a[i-1];
r = Math.max(r, p[i]);
}
int ans = r;
while(l <= r) {
int mid = (l+r)/2;
// 计算插的数量
int cnt = 0;
for(int i = 1;i < n;i++) {
if(p[i]>mid) {
// 向上取整
cnt += (p[i]+mid-1)/mid;
cnt--;
}
}
// 可以,可以减少mid
if(cnt<=k) {
r = mid-1;ans = mid;
}else {
l = mid+1;
}
}
System.out.println(ans);
sc.close();
}
}