二分答案,每次贪心尽量跳远去判断即可
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 500005;
int L, n, m, a[N];
bool judge(int mid) {
int s = 0;
int cnt = 0;
while (s != n) {
for (int i = s + 1; i <= n + 1; i++) {
if (a[i] - a[s] > mid) {
if (s == i - 1) return false;
s = i - 1;
cnt++;
if (cnt > m) return false;
break;
}
}
}
return true;
}
const int INF = 0x3f3f3f3f;
int main() {
while (~scanf("%d%d%d", &L, &n, &m)) {
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
a[++n] = L;
a[n + 1] = INF;
int l = 0, r = L;
while (l < r) {
int mid = (l + r) / 2;
if (judge(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n", l);
}
return 0;
}