zoukankan      html  css  js  c++  java
  • POJ 3579 median 二分搜索,中位数 难度:3

    Median
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 3866   Accepted: 1130

    Description

    Given N numbers, X1X2, ... , 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 = 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 X1X2, ... , XN, ( X≤ 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
    思路: 一眼可知把原数列a排列一遍的时间还是有的,但是要想得到两两之差然后归并则T,M都超,计数范围也太大了,
    把a排序之后两两相减,得到相邻差数组b,那么b就可以构成所有需要的差了,
    那么现在假设有个差delta,使得a[i]+delta<=a[j],a[i]+delta>a[j-1],那么delta一定大于a[j-1]-a[i],a[j-2]-a[i]....delta一定小于等于a[j]-a[i],a[j+1]-a[i],
    使用low_bound可以在logn时间内求出j,nlogn时间就可以求出所有比delta大的差的个数,
    这时就可以判断是否delta算是差的中位数.
    那么直接二分差即可,总时间n*logn*logn,5*1e7-1e8的数量级,可以跑过
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=1e5+5;
    int a[maxn];
    long long halfh,h;
    int n;
    bool judge(int mid){
        long long cnt=0;
        for(int i=0;i<n;i++){
            cnt+=a+n-lower_bound(a+i,a+n,a[i]+mid);
        }
        return cnt>halfh;
    }
    int main(){
        while(scanf("%d",&n)==1){
            h=n*(n-1)/2;halfh=h/2;
            for(int i=0;i<n;i++){scanf("%d",a+i);}
            sort(a,a+ n);
            int l=0,r=a[n-1],mid;
            while(r-l>1){
                mid=r+l>>1;
                if(judge(mid)){
                    l=mid;
                }
                else r=mid;
            }
            printf("%d\n",l);
        }
    }
    

      

     
  • 相关阅读:
    Spring ContextLoaderListener
    判断整数是否是对称数
    jstl缺包时的报错
    Spring初始化日志
    C# 网络编程之最简单浏览器实现
    Java实现 蓝桥杯 算法训练 Anagrams问题
    Java实现 蓝桥杯 算法训练 出现次数最多的整数
    Java实现 蓝桥杯 算法训练 出现次数最多的整数
    Java实现 蓝桥杯 算法训练 字串统计
    Java实现 蓝桥杯 算法训练 字串统计
  • 原文地址:https://www.cnblogs.com/xuesu/p/3969503.html
Copyright © 2011-2022 走看看