题目链接:http://poj.org/problem?id=3579
Median
Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < j ≤ N). We can get C(N,2) differences through this work, and now your task is to find the median of the differences as quickly as you can! Note in this problem, the median is defined as the (m/2)-th smallest number if m,the amount of the differences, is even. For example, you have to find the third smallest one in the case of m = 6. Input The input consists of several test cases. Output For each test case, output the median in a separate line. Sample Input 4 1 3 2 4 3 1 10 2 Sample Output 1 8 Source |
[Submit] [Go Back] [Status] [Discuss]
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator
题目大意:n个数,从中选两个数组成一个集合,求|ai] - a[j]| 的中位数
题目解析:二分|a[i] - a[j]|,具体代码实现如下:
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#define N 100009
using namespace std;
const int inf = 1e9;
const int mod = 1<<30;
const double eps = 1e-8;
const double pi = acos(-1.0);
typedef long long LL;
int a[N];
int main()
{
int n, i, l, r, md, ans;
LL s;
while(~scanf("%d", &n))
{
s = n * (n - 1) / 2;
for(i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
l = 0; r = a[n] - a[1];
while(l <= r)
{
md = (l + r) >> 1;
int k = 0;
for(i = 1; i <= n; i++)
{
k += n - (lower_bound(a + 1, a + n + 1, a[i] + md) - a) + 1;
}
if(k > s / 2) ans = md, l = md + 1;
else r = md - 1;
}
printf("%d\n", ans);
}
return 0;
}