题目链接
题解:二分距离,局部不满足就放,由局部最优推出整体最优
#include <iostream>
#include <cstdio>
#include <cmath>
#include <climits>
using namespace std;
#define INF INT_MAX-100000
const int M=200005;
int n,l,r,mid,T,ans,k;
int w[M],d[M];
void init()
{
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
d[i]=w[i]-w[1];
}
}
inline bool cl(int pos,int x)
{
for(k=pos;k<=n;k++)
if(w[k]-w[pos]>x) break;
for(int j=k;j<=n;j++)
if(w[j]-w[k-1]>x) return false;
return true;
}
bool ok(int x){
for(int i=2;i<=n;i++)
{
if(d[i]>x){
if(cl(i,x)) return true;
return false;
}
}
return true;
}
void work()
{
l=1,r=INF;
while(l<=r){
mid=(l+r)>>1;
if(ok(mid))
r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("true.out","w",stdout);
cin>>T;
while(T--){
init();
work();
}
}