7.13 GPOJ 3579Median

来源:互联网 发布:淘宝新店铺怎么引流量 编辑:程序博客网 时间:2024/06/07 07:26

题意:给出N个数,对于存有每两个数的差值的序列求中位数,如果这个序列有偶数个元素,就取中间偏小的作为中位数。

思路:这题由于N数量太大,没办法直接把差值序列求出来。这么大的数据量只能二分,先把给出的数从小到大排序。二分中位数,比较的方法是在排好序的序列中统计所有差小于等于中位数的数的个数,当该数字等于(n*(n-1)/2)/2+(n*(n-1)/2)%2时即找到答案。

代码:

#include <cstdio>#include <algorithm>using namespace std;int a[100000],n,m;bool C(int k){    int cnt=0;//统计数组a内所有差小于等于k的数的数量。    for(int i=0;i<n;i++){        cnt+=upper_bound(a+i,a+n,a[i]+k)-1-(a+i);    }    return cnt>=m;}int main(){    while(~scanf("%d",&n)){        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        int c=n*(n-1)/2;        m=c/2+(c%2);        sort(a,a+n);        int l=-1,r=a[n-1]-a[0];//二分枚举中位数的大小,右闭左开        while(r-l>1){            int mid=(l+r)/2;            if(C(mid)) r=mid;            else l=mid;        }        printf("%d\n",r);    }    return 0;}

0 0
原创粉丝点击