• P1168 中位数[堆 优先队列]


    题目描述

    给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21k(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,,A2k1的中位数。即前1,3,5,…1,3,5,…1,3,5,…个数的中位数。

    输入输出格式

    输入格式:

    1行为一个正整数N,表示了序列长度。

    2行包含N个非负整数Ai(Ai109)。

    输出格式:

    2(N+1)/2行,第iii行为A1,A3,,A2k1的中位数。

    输入输出样例

    输入样例#1:
    7
    1 3 5 7 9 11 6
    输出样例#1:
    1
    3
    5
    6

    说明

    对于20%的数据,N100;

    对于40%的数据,N3000;

    对于100%的数据,N100000。

     

    解析:

    解法一:

    STL的vector暴力解。

    参考代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<ctime>
     5 #include<queue>
     6 #include<vector>
     7 #include<algorithm>
     8 #define N 100010
     9 using namespace std;
    10 vector<int> a;
    11 int main()
    12 {
    13     int n,x;
    14     cin>>n;
    15     for(int i=0;i<n;i++)
    16     {
    17         scanf("%d",&x);
    18         a.insert(upper_bound(a.begin(),a.end(),x),x);
    19         if(i%2==0) printf("%d
    ",a[(i+1)/2]);
    20     }
    21     return 0;
    22 }

    解法二:

    这里要引入一种堆的新的打开方式:两个堆维护第k大/小的数。

    我们用一个大跟堆存放较小值,一个小根堆存放较大值,也就是说,两个堆保持大根堆中的最大值恒比小根堆中的最小值小这样一种性质。

    每次动态向两个堆中放入数值时,我们都要维护它的性质,使得它是第k大的值。

    求中位数是这个思路的一个变种。

    参考代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<ctime>
     6 #include<cstdlib>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<map>
    11 using namespace std;
    12 priority_queue<int> q;
    13 priority_queue<int,vector<int>,greater<int> > p;
    14 int main()
    15 {
    16     int n,x;
    17     cin>>n;
    18     scanf("%d",&x);
    19     q.push(x);
    20     printf("%d
    ",q.top());
    21     for(int i=2;i<=n;i++)
    22     {
    23         scanf("%d",&x);
    24         if(x<q.top()) q.push(x);
    25         else p.push(x);
    26         while(abs(q.size()-p.size())>1)
    27         {
    28             if(q.size()>p.size()){
    29                 p.push(q.top());q.pop();
    30             }
    31             else{
    32                 q.push(p.top());p.pop();
    33             }
    34             if(i%2){
    35                 if(q.size()>p.size()) printf("%d
    ",q.top());
    36                 else printf("%d
    ",p.top());
    37             }
    38         }
    39     }
    40     return 0;
    41 }

    2019-05-26 17:13:43

  • 相关阅读:
    Spring MVC- 表单提交
    Ajax提交与传统表单提交的区别说明
    CSS各种居中方法
    Android RecyclerView 使用完全解析 体验艺术般的控件
    如何解决VMware上MAC虚拟机不能上网问题
    input标签的hidden属性的应用及作用
    SpringMVC表单标签简介
    EL显示List里嵌套map(Spring MVC3)返回的model
    Spring3 MVC请求参数获取的几种方法
    写数据到文件,并同步到磁盘
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10926669.html
Copyright © 2020-2023  润新知