题意:有n个数组成的一个序列,对于∣Xi - Xj∣ (1≤ i < j ≤ N),这样的数总共C(N,2)个,求出值处在最中间的那个数
先将序列排成有序,之后二分之间的差值。
比如1,2,5,8,9,12
假设现在二分中当前mid=2。
对于1来说,a[i]-a[1]>=mid的有5,8,9,12
对于2来说,a[i]-a[2]>=mid的有5,8,9,12
对于5来说,a[i]-a[3]>=mid的有8,9,12
对于8来说,a[i]-a[4]>=mid的有9,12
对于9来说,a[i]-a[5]>=mid的有12
当前总计14对差值比2大,所以继续二分
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define LL long long
using namespace std;
int n;
int a[100010];
LL tot;
int cal(int k)
{
LL cnt = 0;
for (int i = 0; i < n; i++){
cnt += n-(lower_bound(a+i, a+n, a[i]+k)-a);
}
return cnt > tot;
}
int main()
{
while (~scanf("%d", &n)){
for (int i = 0; i < n; i++) scanf("%d", a+i);
sort(a, a + n);
int l = 0, r = a[n-1]-a[0];
tot = n*(n-1) / 4;
while (r - l > 1){
int m = (l+r)/2;
if (cal(m)) l = m;
else r = m;
}
printf("%d\n", l-1);
}
return 0;
}