zoukankan      html  css  js  c++  java
  • 堆--P1168 中位数

     

    记录一个变量$mid$,我们知道中位数是大小处于中间位置的数,所以建立两个堆,一个大根堆,一个小根堆,大根堆存≤ $mid$的数,小根堆存>$mid$的数。所以我们每次向堆中加入元素时,就通过比较和$mid$的大小关系,选择加入大根堆或者小根堆,但我们在输出答案前需要对$mid$进行调整。如果大根堆和小根堆内的元素个数相同,就无需处理,此时$mid$已然是当前的中位数。如果两个堆中元素个数不同,就需要取个数多的一个堆的堆顶,与$mid$取平均值

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <queue>
     4 #include <algorithm>
     5 using namespace std;
     6 int n;
     7 int a[100000];
     8 int mid;
     9 priority_queue <int,vector<int>,less<int> >q1;
    10 priority_queue <int,vector<int>,greater<int> >q2;
    11 int main()
    12 {
    13     scanf ("%d",&n);
    14     scanf ("%d",&a[1]);
    15     mid=a[1];
    16     printf ("%d
    ",mid);
    17     for (int i = 2;i <= n;i++)
    18     {
    19         scanf ("%d",&a[i]);
    20         if (a[i]>mid) q2.push(a[i]);
    21         else q1.push(a[i]);
    22         if (i%2==1)
    23         {
    24             while (q1.size()!=q2.size())
    25             {
    26                 if(q1.size()>q2.size()){
    27                     q2.push(mid);
    28                     mid=q1.top();
    29                     q1.pop();
    30                 }
    31                 else{
    32                     q1.push(mid);
    33                     mid=q2.top();
    34                     q2.pop();
    35                 }
    36             }
    37             cout<<mid<<endl;
    38         }
    39             }
    40     return 0;
    41 }

     

  • 相关阅读:
    [bzoj3999] [TJOI2015]旅游
    [bzoj3143] [HNOI2013]游走
    [bzoj3140] [Hnoi2013]消毒
    [bzoj3142] [HNOI2013]数列
    [bzoj4860] [BeiJing2017]树的难题
    [bzoj2599] [IOI2011]Race
    [bzoj1558] [JSOI2009]等差数列
    [bzoj3626] [LNOI2014]LCA
    [bzoj4011] [HNOI2015]落忆枫音
    JQuery
  • 原文地址:https://www.cnblogs.com/very-beginning/p/12203266.html
Copyright © 2011-2022 走看看