题目描述
给定
N
N
N个数
X
1
,
X
2
,
.
.
.
,
X
N
X_1,X_2,...,X_N
X1,X2,...,XN,计算每一对数字的差:
∣
X
i
−
X
j
∣
|X_{i} - X_{j}|
∣Xi−Xj∣,
1
≤
i
<
j
≤
N
1 \leq i < j \leq N
1≤i<j≤N。请尽快找到差的中位数!
注意,在这个问题中,中位数被定义为第
m
/
2
m/2
m/2个数,
m
m
m为差的数量。
输入:输入由几个测试用例组成。每个测试用例的第1行都为N。然后给出N个数字,表示 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1,X2,...,XN( X i ≤ 1 0 9 , 3 ≤ N ≤ 1 0 5 X_{i} \leq 10^{9},3 \leq N \leq 10^{5} Xi≤109,3≤N≤105)。
输出:对于每个测试,都单行输出差的中位数。
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int find(int t);
bool check(int val);
int a[100000];
int m, n;
int ans = -1;
int main() {
while (cin >> n) {
cin.get();
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cin.get();
sort(a, a + n);
m = n * (n - 1) / 4;
int l = 0, r = a[n - 1] - a[0];
while (l <= r) {
int min = (l + r) / 2;
if (check(min)) {
l = min+1;
ans = min;
}
else {
r = min - 1;
}
}
cout << ans << endl;
}
}
int find(int t) {//找到数组a中第一个大于等于t的元素的位置
int l = 0, r = n - 1, ans = -1;
while (l <= r) {
int min = (l + r) / 2;
if (a[min] >= t) {
ans = min;
r = min - 1;
}
else {
l = min + 1;
}
}
return ans;
}
bool check(int val) {//返回true:中位数比val大 返回false:中位数比val小
int count = 0;
for (int i = 0; i < n; i++) {
count+=n-(lower_bound(a,a+n,a[i]+val)-a);
}
return count > m;
}