One
#include <iostream>
#include <cstdio>
using namespace std;
int l, n, m, res;
int dis[50010];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> l >> n >> m;
dis[0] = 0;
dis[n+1] = l;
for (int i = 1; i <= n; i++) cin >> dis[i];
int lt = 0, r = l;
while (lt <= r){
int mid = (lt+r)/2, cur = 0, cnt = 0;
for (int i = 1; i <= n+1; i++){
if (dis[i]-dis[cur] < mid) cnt++;
else cur = i;
}
if (cnt <= m){
res = mid;
lt = mid+1;
}
else r = mid-1;
}
cout << res;
return 0;
}
Two
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int l, n, m, pre, cur, last;
int dis[50010];
void bi(int l, int r){
int cnt = 0, mid = (l+r)/2;
for (int i = 1; i <= n+1; i++){
if (dis[i] < mid){
cnt++;
int sum = dis[i];
while (i <= n && dis[i+1]+sum < mid){
sum += dis[i+1];
cnt++;
i++;
}
if (cnt > m) break;
if (i <= n && dis[i+1]+sum >= mid) i++;
}
}
if (mid == l){
cout << mid;
exit(0);
}
if (cnt > m) bi(l, mid);
else if (cnt <= m) bi(mid, r);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> l >> n >> m;
cur = pre = 0;
for (int i = 1; i <= n; i++){
cin >> cur;
dis[i] = cur - pre;
pre = cur;
}
dis[n+1] = l-pre;
if (m == 0) cout << l;
else bi(1, l);
return 0;
}