P1168 中位数 堆

题目描述

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

输入格式

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

22行包含NN个非负整数A_i (A_i ≤ 10^9)Ai(Ai109)。

输出格式

(N + 1) / 2(N+1)/2行,第ii行为A_1, A_3, …, A_{2k - 1}A1,A3,,A2k1的中位数。

  

本题要用到优先队列定义堆:

such as:

    priority_queue<int,vetor<int>,greater<int> >p1;——小根堆(扔进去的数据自动排为由小到大)

    priority_queue<int,vector<int>,less<int> >p2; ——大根堆(扔进去的数据自动排为由大到小)

堆顶堆:

   

 代码(愿以后的我能看懂):

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 priority_queue<int,vector<int>,less<int> >p2;
 4 priority_queue<int,vector<int>,greater<int> >p1;
 5 int n,x;
 6 int mid;
 7 int main()
 8 {
 9     cin>>n;
10     cin>>x;
11     mid=x;
12     cout<<mid<<endl;//取中位数 
13     for(int i=2;i<=n;i++)
14     {
15         cin>>x;
16         if(x<mid)
17             p2.push(x);
18         if(x>mid)
19             p1.push(x);
20         if((i-1)%2==0)
21         {
22             if(p1.size() >p2.size() )
23             {
24                 p2.push(mid); 
25                 mid=p1.top() ;
26                 p1.pop() ; 
27             }
28             if(p1.size() <p2.size() )
29             {
30                 p1.push(mid) ;
31                 mid=p2.top() ;
32                 p2.pop() ;
33             }
34             cout<<mid<<endl;    
35         }              
36     }
37 return 0;
38 } 

 

posted @ 2019-11-01 20:28  Berserker兰斯洛特  阅读(148)  评论(0编辑  收藏  举报