| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 5066 | Accepted: 1618 |
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.
In each test case, N will be given in the first line. Then N numbers are given, representing X1, X2, ... , XN, ( Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 )
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
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=110000;
int n,a[maxn],k,lp,rp,mid;
bool check(int mid)
{
int sum=0,temp;
for(int i=0;i<n;i++)
{
temp=a[i]-(mid-1);
sum+=&a[i]-lower_bound(a,a+n,temp);
}
if(sum>=k) return false;
else return true;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
k=n*(n-1)/2;
if(k%2==0) k=k/2;
else k=k/2+1;
sort(a,a+n);
lp=0;rp=a[n-1]-a[0];
while(rp-lp>1)
{
mid=(lp+rp)/2;
if(check(mid)) lp=mid;
else rp=mid;
}
cout<<lp<<endl;
}
return 0;
}这道题有几个坑点:
)
)。
本文介绍了一种高效算法,用于从给定的一组整数中计算所有可能数对差值的中位数。通过使用二分查找和快速排序技巧,该算法能在大数据集上快速运行。
1594

被折叠的 条评论
为什么被折叠?



