二分
一个传送门肯定放终点,另一个我们用二分来求sum。
在sum之内的点不需要考虑,我们要使sum之外的点到sum的距离都小于mid,让另一个传送门可以覆盖2mid的区域
当最左端和最右端的距离小于2*mid时,就可以缩小R
#include <bits/stdc++.h> #include <algorithm> typedef long long ll; using namespace std; int a[100005]; int inf=1e9; int n; bool check(int mid) { int l=inf,r=-inf; for (int i =1 ; i <=n; ++i) if ((abs(a[i]) > mid)) { r=max(a[i],r);//最右边 l=min(a[i],l);//最左边 } if((r-l+1)/2<=mid)return 1; else return 0; } int main() { int T; cin>>T; while (T--) { int l, r, mid; cin>>n; for(int i = 1; i <=n; ++i)cin>>a[i]; sort(a+1, a + n+1); l = 0; r = max(abs(a[1]),a[n]); int sum; while (l+1 < r) { mid = (l + r) >> 1; if (check(mid)) r = mid-1,sum=mid; else l = mid + 1; } printf("%d\n", sum); } return 0; }