堆--P1168 中位数

题目描述

给出一个长度为N的非负整数序列Ai,对于所有1≤k≤(N+1)/2,输出A1,A3,…,A2k−1的中位数。即前1,3,5,…个数的中位数。

输入格式

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

2行包含N个非负整数Ai(Ai≤109)

输出格式

(N+1)/2行,第i行为A1,A3,…,A2k−1的中位数。

首先记录一个变量mid,记录答案(中位数)。建立两个堆,一个大根堆一个小根堆,大根堆存≤mid的数,小根堆存 >mid的的数。

所以我们向堆中加入元素时,就通过与mid的比较,选择加入哪一个堆

但我们在输出答案前需要对mid进行调整,如果小根堆和大根堆内元素相同,就无需处理,此时mid仍然是当前的中位数。

如果两个堆中元素个数不同,那我们就需要进行调整。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 int n;
 7 int a[100000];
 8 int mid;
 9 priority_queue <int,vector<int>,less<int> >q1;
10 priority_queue <int,vector<int>,greater<int> >q2;
11 int main()
12 {
13     scanf ("%d",&n);
14     scanf ("%d",&a[1]);
15     mid=a[1];
16     printf ("%d\n",mid);
17     for (int i = 2;i <= n;i++)
18     {
19         scanf ("%d",&a[i]);
20         if (a[i]>mid) q2.push(a[i]);
21         else q1.push(a[i]);
22         if (i%2==1)
23         {
24             while (q1.size()!=q2.size())
25             {
26                 if(q1.size()>q2.size()){
27                     q2.push(mid);
28                     mid=q1.top();
29                     q1.pop();
30                 }
31                 else{
32                     q1.push(mid);
33                     mid=q2.top();
34                     q2.pop();
35                 }
36             }
37             cout<<mid<<endl;
38         }
39             }
40     return 0;
41 }

猜你喜欢

转载自www.cnblogs.com/very-beginning/p/12203266.html