zoukankan      html  css  js  c++  java
  • 中位数( 优先队列较优处理 )

               首先 ,不妨假设 mid 为最初的中位数,开一个小根堆存储 q1(<=mid )一个大根堆存储 q2( >mid )当向堆中加入元素通过与 mid 比较

            

    1 scanf("%d",&a[i]);
    2 if(a[i]>mid) q2.push(a[i]);
    3 else q1.push(a[i]);

               当两堆中元素个数不等的时候 就要维护 mid  肯定是多的元素堆移向少的元素堆 

              

     1        if(q1.size()>q2.size()){
     2             while(q1.size()!=q2.size()){
     3                 q2.push(mid);
     4                 mid=q1.top();q1.pop();
     5             }
     6         }
     7         else if(q1.size()<q2.size()){
     8             while(q1.size()!=q2.size()){
     9                 q1.push(mid);
    10                 mid=q2.top();q2.pop();
    11             }
    12         }

    一道简单例题::https://www.luogu.org/problem/P1168

     1 #include<bits/stdc++.h>
     2 #define ull unsigned long long
     3 #define ll long long
     4 const int MOD=1e9+7;
     5 const int maxn=1e5+5;
     6 using namespace std;
     7 
     8 int a[maxn];
     9 priority_queue<int,vector<int>,less<int> >q1;
    10 priority_queue<int,vector<int>,greater<int> >q2;
    11 
    12 int main()
    13 {
    14     int n;
    15     scanf("%d",&n);
    16     for(int i=1;i<=n;i++)
    17     {
    18         scanf("%d",&a[i]);
    19     }
    20     int mid=a[1];
    21     printf("%d
    ",mid);
    22     for(int i=3;i<=n;i+=2)
    23     {
    24         if(a[i-1]<=mid){
    25             q1.push(a[i-1]);
    26         }
    27         else{
    28             q2.push(a[i-1]);
    29         }
    30         if(a[i]>mid){
    31             q2.push(a[i]);
    32         }
    33         else{
    34             q1.push(a[i]);
    35         }
    36         if(q1.size()>q2.size()){
    37             while(q1.size()!=q2.size()){
    38                 q2.push(mid);
    39                 mid=q1.top();q1.pop();
    40             }
    41         }
    42         else if(q1.size()<q2.size()){
    43             while(q1.size()!=q2.size()){
    44                 q1.push(mid);
    45                 mid=q2.top();q2.pop();
    46             }
    47         }
    48         printf("%d
    ",mid);
    49     }
    50     return 0;
    51 }
    View Code
    纵使单枪匹马,也要勇闯天涯
  • 相关阅读:
    CentOS7 时间设置与网络同步
    CentOS7 系统升级,删除centos7开机界面多余选,升级至最新的内核
    Docker 编排工具Rancher 2.0
    Docker 编排工具Rancher 1.6.18
    通过WSL在Windows下安装子Linux系统
    Docker 使用Dockerfile构建redis镜像
    初探PHP多进程
    nginx转发
    mime类型
    socket php
  • 原文地址:https://www.cnblogs.com/sj-gank/p/11728893.html
Copyright © 2011-2022 走看看