题意:给n个数,求所有|ai-aj|的中位数。
思路:看到中位数,应该要敏感的考虑二分。设中位数为x,|ai-aj|=ci,
有1/2的ci大于x,还有1/2的ci小于x,然后不同的aj>ai的对数是1到n的累加,也就是c(n,2),那么二分的check函数找到了。在check中枚举每个ai+x,求大于等于它的aj的个数,累加判断就好了。假如7,那要3个大于,假如6,根据题意也要有3个大于。
const int N = 1e5 + 5;
int a[N];
int t;
int n,m;
bool check(int mid)
{
int cot = 0;
f(i, 1, n)//枚举ai+x,求和每次aj>=x+ai的个数
{
cot += n - (lower_bound(a + 1, a + 1 + n, a[i] + mid) - (a + 1));
}
if (cot >m/2)return true;
return false;
}
int main()
{
while (cin >> n)
{
f(i, 1, n)scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
m = n * (n - 1) / 2;//c(n,2)
int l = 0, r = a[n] - a[1];
int ans;
while (l <= r)
{
int mid = (l + r) / 2;
if (check(mid)) {
ans = mid; l = mid + 1;
}
else r = mid-1;
}
cout << ans<< endl;
}
return 0;
}