考虑二分答案。
二分出来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; }