这个题求的是一列数所有相互之间差值的序列的最中间的值是多少。看到数据可以看到用普通的n^2方法必定超时,这里我想到的是二分方法,即二分答案,每次得到答案后我们进行验证即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+1000;
int a[maxn],n,m,ans;
bool test(int val)
{
int cnt=0;
for(int i=0;i<n;i++)
{
cnt+=n-(lower_bound(a,a+n,a[i]+val)-a);
}
if(cnt>m)
{
return true;
}
return false;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
m=n*(n-1)/4;
ans=-1;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int l=0,r=a[n-1]-a[0];
while(l<=r)
{
int mid=(l+r)>>1;
if(test(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}