贪心题目。
显然可以发现一个性质。。。
接下来就是二分判断。。
首先二分一个最大路径,然后枚举虫洞的位置,考虑冲突时决策的调整。
先将虫洞的位置设在第一个到1距离>mid的点,然后继续向后扫描,
发现一个点j到i的距离也大于mid,这样就将j-1设成虫洞,然后看后面的点到j-1的距离是否符合要求。
这样做一定是最优的。(因为要想满足全部条件,首先局部必须满足,否则就无法满足全部条件,因此一步一步的考虑)
#include<cstdio>
using namespace std;
int n,t,d[200000],x[200000];
bool check(int mid)
{
int j;
for(int i=1;i<=n;i++)
if(d[i]>mid)
{
for(j=i;j<=n+1;j++)
if(d[j]-d[i]>mid) break;
for(int k=j;k<=n;k++)
{
if(d[k]-d[j-1]>mid) return false;
}
return true;
}
return true;
}
int main()
{
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
int l=0,r=1000000000,mid,ans=999999999;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
d[i]=x[i]-x[1];
}
if(k==2)
check(1);
while(l<=r)
{
mid=(l+r)/2;
if(check(mid)) {ans=mid; r=mid-1;}
else l=mid+1;
}
printf("%d\n",ans);
}
}