题意:0和L处分别为起点和终点,中间有N个点,每个点离起点Di距离,可以删除其中m个点,使得每两个点之间的最小距离变得最大,求这个最大距离
思路:二分距离,若两个点之间的距离大于当前距离,删除中间所有点,求出删除点的总数,满足删除点小于等于m的最后一个数即为答案,注意终点和最后一个距离不大于当前距离的点之间的点也要算上
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
const int inf = 0x3f3f3f3f;
int L, n, m, a[maxn];
bool solve(int t)
{
int sum = 0, j = 0;
for (int i = 1; i <= n+1; i++) {
if (a[i]-a[j] > t) {
sum += i-j-1;
j = i;
}
}
sum += n+1-j;
return sum <= m;
}
int main()
{
while (~scanf("%d%d%d", &L, &n, &m)) {
a[0] = 0;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a+1, a+n+1);
a[n+1] = L;
int l = 0, r = L+1;
while (l <= r) {
int mid = (l+r) >> 1;
if (solve(mid))
l = mid + 1;
else
r = mid - 1;
}
printf("%d\n", l);
}
}