链接:点击打开链接
题意:求由∣Xi - Xj∣ (1 ≤ i < j ≤ N).组成的数列的中位数
代码:
#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long X[100005];
long long N;
int judge(long long d){
int i,sum;
sum=0;
for(i=0;i<N;i++)
sum+=(N-(lower_bound(X,X+N,X[i]+d)-X)); //找比a[i]大d的数个数
return sum;
}
int main(){
long long i,j,l,r,mid,ans,tmp;
while(scanf("%I64d",&N)!=EOF){
tmp=N*(N-1)/4+1; //所有组数除以二在加上中位数那一组
for(i=0;i<N;i++)
scanf("%I64d",&X[i]);
sort(X,X+N);
l=0,r=X[N-1]-X[0];
while(l<=r){ //先二分答案再通过另一个二分判断是否
mid=(l+r)/2; //满足这个数列
if(judge(mid)>=tmp){
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
printf("%I64d\n",ans);
}
return 0;
}