这么一道简单题,居然因为2次看错题目被卡住了。。。
二分一下就好。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=50050;
long long n,m,x;
long long p[MAXN];
bool judge(long long limit)
{
long long bef=x,i,dis;
for(i=0;i<n;i++)
{
dis=min(p[i]+limit,m-x)-max(bef,p[i]-limit);
if(dis>=0)
bef=max(bef,p[i]-limit)+(x<<1);
else
return 0;
}
return 1;
}
int main()
{
long long i,lef,rig,mid;
while(scanf("%lld%lld%lld",&n,&x,&m)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lld",&p[i]);
if(2*n*x>m)
{
printf("-1\n");
continue;
}
lef=0;rig=m;
while(lef<=rig)
{
mid=(lef+rig)>>1;
if(judge(mid))
rig=mid-1;
else
lef=mid+1;
}
printf("%lld\n",lef);
}
}

本文介绍了一种使用二分查找算法解决特定路径覆盖问题的方法。通过设定限制条件,判断路径是否能被完全覆盖,并逐步逼近最优解,最终找到最小的限制值使路径能够被完全覆盖。
3947

被折叠的 条评论
为什么被折叠?



