标签:
题意:
给n个数,他们两两之间较大数减去较小数总共有n*(n-1)/2个数,要求这些数的中位数。
分析:
两次二分,第一次枚举答案,第二次判断该数是否可能成为中位数。
代码:
//poj 3579 //sep9 #include <iostream> #include <algorithm> using namespace std; const int maxN=1e5+10; int a[maxN]; int n,m; int test(int x) { int sum=0; for(int i=0;i<n;++i) sum+=lower_bound(a+i,a+n,a[i]+x)-(a+i)-1; if(sum<=m) return 1; return 0; } int main() { while(scanf("%d",&n)==1){ for(int i=0;i<n;++i) scanf("%d",&a[i]); sort(a,a+n); int l,r,mid,ans; m=n*(n-1)/2; if(m%2==1) m/=2; else m=m/2-1; l=0,r=a[n-1]-a[0]+1;//[) while(l<r){ mid=(l+r)/2; if(test(mid)){ l=mid+1; ans=mid; }else r=mid; } printf("%d\n",ans); } return 0; }
poj 3579 Median 二分查找与lower_bound
标签:
原文地址:http://blog.csdn.net/sepnine/article/details/42993865