堆--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 }

 

posted @ 2020-01-16 21:06  小又又  阅读(175)  评论(0编辑  收藏  举报