当前位置: 代码迷 >> 综合 >> poj 3579 Median 二分查找与lower_bound
  详细解决方案

poj 3579 Median 二分查找与lower_bound

热度:35   发布时间:2024-01-19 06:02:45.0

题意:

给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;elsem=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;}elser=mid;}printf("%d\n",ans);}	return 0;	
} 


  相关解决方案