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

    hhhhhhhh神奇传送门
    呐呐呐,看到题目第一眼想到的当然是暴力模拟了,但是O(n*n)的时间复杂度确实受不了
    那我们该想到啥捏??
    对了,二叉堆!!!虽然我也不知道为什么嘤嘤嘤
    好嘛,既然想到了二叉堆,就得想想如何去实现了
    中位数的话呢,就是这个数在序列中前后数字个数相同(因为个数是奇数),那么构建两个堆,一个大根堆,用于装比中位数小的,另一个小根堆用于装比中位数大的
    是不是很简单啊
    好的上代码::

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<queue>
     5 #include<cstring>
     6 #include<iostream>
     7 using namespace std;
     8 
     9 int n,zy;
    10 priority_queue < int > z;
    11 priority_queue < int,vector<int>,greater<int> > y;
    12 
    13 int abs(int a){//手写abs会快一点??
    14     return a<0?-a:a;
    15 }
    16 
    17 int main(){
    18     scanf("%d%d",&n,&zy);
    19     z.push(zy);
    20     printf("%d
    ",z.top());
    21     for (int i=2;i<=n;i++){
    22         scanf("%d",&zy);
    23         if (zy>z.top()){
    24             y.push(zy);
    25         }
    26         else{
    27             z.push(zy);
    28         }
    29         int l=z.size()-y.size();//l用于表示两个堆中个数相差之数,若大于1,则说明不平均,进行以下判断,调换堆中元素
    30         while(abs(l)>1){
    31             if (z.size()>y.size()){
    32                 y.push(z.top());
    33                 z.pop();
    34             }
    35             else{
    36                 z.push(y.top());
    37                 y.pop();
    38             }
    39             l=z.size()-y.size();
    40         }
    41         if (i%2){
    42             printf("%d
    ",z.size()>y.size()?z.top():y.top());
    43         }
    44     }
    45     return 0;
    46 }

    好的好的,那多的就没什么好说的了 祝大家身体健康,万事如意 我为什么要废这个话??

    但是,我还是得废一句话:新人开博鼓励一下吧。。。

  • 相关阅读:
    轮播制作
    前端问题总结
    响应式 媒体查询 盒模型
    响应式 字体设置 flex 弹性布局
    C++ STL之set常用指令
    SRM468
    SRM470
    置换及其应用专题
    C++ STL之map常用指令
    C++ STL之pair常用指令
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11123227.html
Copyright © 2011-2022 走看看