思路:二分枚举下绳子的最长长度即可,找出最小的。
//
// main.cpp
// 51-排船的问题
//
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 50005;
int n, x, m;
int p[MAXN];
bool done(int len) {
int head = 0, tail = 0;
for(int i = 0; i < n; i++) {
head = tail;
if(head + x <= p[i] + len) {
tail = max(head + x * 2, p[i] - len + x);
}
else {
return false;
}
}
if(tail > m) return false;
return true;
}
int main(int argc, const char * argv[]) {
cin >> n >> x >> m;
for(int i = 0; i < n; i++) {
cin >> p[i];
}
if(2 * x * n > m) {
cout << -1 << endl;
return 0;
}
int l = 0, r = m - 1;
int res = 0;
// 二分枚举出来最长中最短的
while(l <= r) {
int mid = (l + r) >> 1;
if(done(mid)) {
res = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
cout << res << endl;
return 0;
}