分析:
补题,真的想不到二分,只要找出区间内的三个点,能够覆盖整个区间即可满足题意,找最小覆盖区间的距离,在于找最小距离,也就可以二分,二分距离,找出三段2*d的长度可以覆盖全部区间的最小d,也就是最后的答案。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=2e5+10;
ll a[N];
int n;
bool check(int x)
{
int cnt=0;
int in=1;
for(int i=2;i<=n;i++)
{
if(a[in]+2*x<a[i])
{
in=i;
cnt++;
}
}
return cnt<3;
}
void solve()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
set<ll> s;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s.insert(a[i]);
}
if(s.size()<=3)
{
cout<<0<<'\n';
continue;
}
sort(a+1,a+1+n);
int l=0;
int r=a[n];
while(l<r)
{
int mid=l+r >> 1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<'\n';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}