考虑二分答案。
二分出来mid,那么对于绝对值≤mid的,我们不需要管他,因为他可以直接走到原点,在mid时间内一定可以到。
那么对于剩下的呢?我们对于剩下的去找最大值max和最小值min,如果max - min <= 2 * mid,说明mid这个是满足答案的,那么就需要下降二分上界,至于一个门放在了原点处,另一个门在哪我们并不关注,只要满足max - min <= 2 * mid,那么第二个门一定在min到max之间,并且会尽可能地居中。
其实不难发现,要满足这个式子,一定要满足除去绝对值≤mid后的剩下的a[i]要同(符)号,不然必有max - min > 2 * mid
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1<<17];
int n;
bool check(int x){
ll ma=-2e9,mi=2e9;
for(int i=1;i<=n;i++){
if(abs(a[i])<=x) continue;
ma=max(ma,a[i]);
mi=min(mi,a[i]);
}
return ma-mi<=2*x;
}
int main(){
int t;cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int l=0,r=2e9;
int ans;
while(l+1<r){
int mid=l+r>>1;
if(check(mid)) ans=mid,r=mid;
else l=mid;
}
cout<<ans<<endl;
}
return 0;
}

京公网安备 11010502036488号