给你 N N个数, X1,X2,...,XN X1,X2,...,XN, 基爷让我们计算任意两个数差的绝对值 ∣Xi−Xj∣ ∣Xi−Xj∣ (1≤i<j≤N) (1≤i<j≤N) 。 这样,我们可以得到 C2N CN2 个数。
现在,基爷希望聪明的你能用一个简单的程序求出这 C2N CN2 个数的中位数!
输入有多组数据。
每组数据,第一行一个整数 N N,第二行给出 N N 个整数 X1,X2,...,XN X1,X2,...,XN ( |Xi|≤1,000,000,000 |Xi|≤1,000,000,000; 3≤N≤100,000 3≤N≤100,000 )
基爷的中位数
! )
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define maxn 100004 long long num[maxn]; int main() { //freopen("input.txt", "r", stdin); long long n; while (scanf("%lld", &n) != EOF) { for (int i = 0; i < n; ++i) scanf("%lld", &num[i]); sort(num, num + n); long long pos = n*(n - 1) / 2; pos = (pos + 1) >> 1; long long l = 0, r = 2000000005, mid, ans = -1; while (l < r) { mid = (l + r) >> 1; long long tmp = 0; for (int i = 0; i < n; ++i) { tmp += lower_bound(num + i + 1, num + n, num[i] + mid + 1) - num - i - 1; //printf("%lld\n", tmp); } if (tmp >= pos) r = mid; else l = mid + 1; } printf("%lld\n", r); } //system("pause"); //while (1); return 0; }