​题目链接​

题意:

给你n个数,代表到原地的距离,让你求能否拿掉最多M个石头,使得各石头之间的最小距离最大。

思路:

我们枚举最小距离,我们统计比 最小距离 还小 两个数之间 的距离,如果是m个以内,那么我们就继续二分这个数,扩大这个数的值,如果超过m个,那么我们就缩小。

Ac代码

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
static int L, n, m;
static int a[] = new int[50005];
static boolean solve(int x) {
int now = 0;
int cnt = 0;
a[n + 1] = L;
for(int i = 1;i <= n + 1;i++) {
if(a[i] - a[now] < x) {
cnt++;
} else {
now = i;
}
}
return cnt <= m;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);

L = cin.nextInt();
n = cin.nextInt();
m = cin.nextInt();
for(int i = 1;i <= n;i++) {
a[i] = cin.nextInt();
}
Arrays.sort(a, 1 ,n + 1);
int l = 0, r = L;
while(l <= r) {
int mid = (l + r) >>> 1;
if(solve(mid)) l = mid + 1;
else r = mid - 1;
}
System.out.println((l + r) >>> 1);

}
}