二分+贪心
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int l, n, m;
int a[50005];
cin >> l >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
a[n + 1] = l;
sort(a, a + n + 1);
int lo = 1, hi = l, mid;
while(lo <= hi){
mid = (lo + hi) / 2;
int cnt = 0, last = 0;
for(int i = 1; i <= n + 1; i++){
if(a[i] - a[last] <= mid) cnt++; //需要搬走石头
else last = i; //否则就把当前编号作为左端点
}
if(cnt > m) hi = mid - 1;
else lo = mid + 1;
}
cout << lo << endl;
return 0;
}