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 ;
}