题目大意:
给出n(3<=n<=100000)个数,f(i,j)=|a[i]-a[j]| (1<=i小于j<=n)。求所有的f(i,j)里面中位数的值。
思路,二分查找中位数:
# include<stdio.h>
# include<stdlib.h>
#include<algorithm>
using namespace std;
int a[100000],o,n;
int lily(int x,int y){//二分
int r=1,l=y,mid;
while(r<l){
mid=(r+l)/2;
if(a[mid]<x)r=mid+1;
else l=mid;
}
return r;
}
int ok(int x){
int sum=0;
for(int i=1;i<=n;i++){
sum+=i-lily(a[i]-x,i);
if(sum>=o)return 1;//如果大于则返回以
}
return 0;
}
int main(){
int l,r;
while(scanf("%d",&n)>0){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);//读入
}
o=n*(n-1)/2;
o=(o+1)/2;
sort(a+1,a+n+1);
r=0;
l=1000000;
while(r<l){//二分
int mid=(r+l)/2;
if(!ok(mid))r=mid+1;//判断可行性
else l=mid;
}
printf("%d\n",r);
}
}