有两个快递员,分别在
先输入
题解
CF 如此多的二分+贪心,但我就是想不出来……
首先二分答案。
难点是在如何判断答案合法。
显然正着做是不行的,所以我们考虑倒着做。
我们考虑现在二分的距离为
现在考虑从
显然,两个快递员中只有一个快递员动,而不动的那个快递员必须已经在
我们考虑下面两种情况:
如果
如果
代码
cpp
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
const int inf = 0x3f3f3f3f;
int n, s1, s2;
int aa[maxn];
inline bool check(int x)
{
int l = -inf, r = inf;
for(int i = n; i; --i)
{
if(l <= aa[i] && aa[i] <= r)
l = aa[i] - x, r = aa[i] + x;
else
l = max(l, aa[i] - x), r = min(r, aa[i] + x);
}
return (l <= s1 && s1 <= r) || (l <= s2 && s2 <= r);
}
int main()
{
scanf("%d%d%d", &n, &s1, &s2);
for(int i = 1; i <= n; ++i)
scanf("%d", &aa[i]);
int l = abs(s1 - s2), r = inf;
while(l < r)
{
int mid = (l + r) >> 1;
if(check(mid))
r = mid;
else
l = mid + 1;
}
printf("%d\n", l);
return 0;
}