计算每组数字差的绝对值的中位数

http://poj.org/problem?id=3579

题意很简单

如果直接计算差值 n方一定会炸

这里采用二分的方法

首先 计算二分的范围

然后 对每次的mid  相当于计算每个数的贡献 在每个数a[i]  到 a[i]+mid 有多少个数

n个数 一共有n*(n+1)/2个组合 在中间就是(n*(n+1)/2)+1或者n*(n+1)/2

然后看是不是中间那个就可以了   

#include <iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100010];
int n,m;
bool check(int mid)
{
    int ans=0;
    for(int i=0;i<n;i++)
    {
        ans+=((upper_bound(a, a + n, a[i] + mid) - a)-1-i);
    }
    return ans>=m;
}
int main()
{
    while(cin>>n)
    {
        m=n*(n-1)/2+1;
        m=m/2;
        if(n==0) break;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        int l=0,r=a[n-1]-a[0];
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(check(mid))
                r=mid-1;
            else
                l=mid+1;

        }
        if(check(r))
            printf("%d\n",r);
        else printf("%d\n",l);
    }
    return 0;
}

 

posted @ 2019-07-30 10:58  AAAzhuo  阅读(339)  评论(0)    收藏  举报