zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    洛谷 P1886 滑动窗口(单调队列)
    POJ 2559 Largest Rectangle in a Histogram(单调栈)
    eclipse开发velocity实例(初学)
    Spring MVC 教程,快速入门,深入分析
    传智博客(JavaWeb方面的所有知识)听课记录(经典)
    JSP/SERVLET入门教程--Servlet 使用入门
    javaweb入门实例---servlet例子
    Eclipse快捷键大全(转载)
    简单java web应用程序搭建与部署
    Servlet 工作原理解析
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10926669.html
Copyright © 2011-2022 走看看