二分法找答案
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 500000 + 9;
int l, n, m;
int a[MAXN];
bool ok(int x)
{
//cout << x << endl;
int s = 0; //开始跳的点
int i = 1; //要跳到的点
int total = 0;
while (i <= n + 1)
{
if (a[i] - a[s] > x) return false;
while (i <= n + 1 && a[i] - a[s] <= x) {
i++;
}
total++;
s = i - 1;
}
if (total <= m) return true;
return false;
}
void solve()
{
a[0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
a[n + 1] = l;
sort(a, a + n + 2);
int p = 0, q = l;
while(p < q) {
int mid = (p + q) / 2;
if(ok(mid)) q = mid;
else p = mid + 1;
}
printf("%d\n", q);
}
int main()
{
//freopen("in.txt", "r", stdin);
while (scanf("%d%d%d", &l, &n, &m) != EOF) {
solve();
}
}