堆--P1168 中位数
记录一个变量$mid$,我们知道中位数是大小处于中间位置的数,所以建立两个堆,一个大根堆,一个小根堆,大根堆存≤ $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 }