题目大意:
给出一个长度为L的路,现已经有n个路障,为还可以最多添加k给路障,是的路障间的最大相隔距离最小。
思路:
考虑二分相距距离mid,然后对于相邻的现有两个路障判断距离是否是<=mid,否则就向里面加路障
(
a
i
−
a
i
−
1
)
/
m
i
d
(a_i-a_{i-1})/mid
(ai−ai−1)/mid。
注意考虑(a_i-a_{i-1})/mid == 0,因为此时最后一个路障就刚好放在 a i a_i ai,所以还要减一
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e5 + 10;
int L, n, k, a[N], l, r, mid, ans;
bool check(int x)
{
int tot = 0;
for(int i = 2; i <= n; i++)
{
if(a[i] - a[i - 1] > mid)
{
int tmp = a[i] - a[i - 1];
tot += floor(tmp / x);
if(tmp % x == 0) tot--;
}
}
return (tot <= k);
}
int main()
{
scanf("%d%d%d", &L, &n, &k);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
l = 0, r = L;
while(l <= r)
{
mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}