二分
一个传送门肯定放终点,另一个我们用二分来求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;
} 
京公网安备 11010502036488号