经典的二分,理解起来稍难....
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 50000+10;
int rock[maxn];
bool judge(int x, int n, int m) {
int last = 0;
for (int i = 1; i < n - m; i++) {
int cur = last + 1;
while (cur < n && rock[cur] < rock[last] + x) {
cur++;
}
if (cur == n) {
return false;
}
last = cur;
}
return true;
}
int main(int argc, char const *argv[]) {
int l, n, m;
scanf("%d%d%d", &l, &n, &m);
rock[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &rock[i]);
}
rock[n+1] = l;
n += 2;
sort(rock, rock + n);
int left = 0;
int right = l+1;
while (right - left > 1) {
int mid = (left + right) / 2;
if (judge(mid, n, m)) {
left = mid;
} else {
right = mid;
}
}
printf("%d\n", left);
return 0;
}