• LuoGu P1168 中位数


    题目描述
    给出一个长度为 $ N $ 的非负整数序列 $ A_i $ ,对于所有 $ 1 ≤ k ≤ (N + 1) / 2 $ ,输出 $ A_1, A_3, …, A_{2k - 1} $ 的中位数。即前 $ 1,3,5,… $ 个数的中位数。

    输入输出格式
    输入格式:
    第 $ 1 $ 行为一个正整数 $ N $ ,表示了序列长度。

    第 $ 2 $ 行包含 $ N $ 个非负整数 $ A_i (A_i ≤ 10^9) $

    输出格式:
    共 $ (N + 1) / 2 $行,第 $ i $ 行为 $ A_1, A_3, …, A_{2k - 1}$ 的中位数。

    输入输出样例
    输入样例#1:

    7
    1 3 5 7 9 11 6
    

    输出样例#1:

    1
    3
    5
    6
    

    说明
    对于 $ 20% $ 的数据,$ N ≤ 100 $ ;

    对于 $ 40% $ 的数据,$ N ≤ 3000 $ ;

    对于$ 100% $ 的数据,$N ≤ 100000 $

    双堆搞事...中位数的特性是所有数字排序后中间的数字,所以用大根堆和小根堆来维护区间,边读入就可以维护了
    你把大的扔一边,小的扔一边,然后你看看哪一个堆比较大,那个堆顶的元素就是中位数了

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    
    using std::priority_queue ;
    
    priority_queue < int > lar ;
    priority_queue < int , std:: vector < int > , std:: greater < int > > sma ;
    
    int n , v ;
    
    int main(){
        scanf ("%d" , & n );
        scanf("%d" , & v ) ; lar.push( v ) ;
        printf("%d
    " , v );
        for (int i = 2 ; i <= n ; ++ i){
            scanf ("%d" , & v) ;
            if (v > lar.top () ) sma.push( v ) ;
            else lar.push( v ) ;
            while ( abs( lar.size() - sma.size() ) > 1 ){
                if ( lar.size() > sma.size() ) sma.push( lar.top() ) , lar.pop() ;
                else lar.push( sma.top() ) , sma.pop() ;
            }
            if ( i & 1 ) printf("%d
    " , lar.size() > sma.size() ? lar.top() : sma.top() );
        }
        return 0;
    }
    
    May you return with a young heart after years of fighting.
  • 相关阅读:
    Linux进程理解与实践(四)wait函数处理僵尸进程
    Linux进程理解与实践(三)进程终止函数和exec函数族的使用
    system V信号量和Posix信号量
    Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存
    linux 高并发socket通信模型
    信号集函数
    进程间通信使用信号
    使用消息队列
    改变域名,php
    php函数
  • 原文地址:https://www.cnblogs.com/Equinox-Flower/p/9917150.html
Copyright © 2020-2023  润新知