HDU - 3282 优先队列的使用

题意:

按照顺序给你n个数,当数的数量是奇数的时候就输出它们的中位数

 

题解:

优先队列默认是大顶堆,即priority_queue.top()是这个队列中的最大值

 

那么我们就可以先创造一个大顶堆优先队列qmax,和一个小顶堆qmin

 

qmin里面放的是大于等于中位数的数,qmax里面放的是比中位数小的数
因为qmin是小顶堆,那么qmin.top()肯定就是中位数
(上面的话是在中位数的前提下)

 

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     scanf("%d",&t);
 7     while(t--)
 8     {
 9         priority_queue<int > qmax;  //大顶堆
10         priority_queue<int ,vector<int > ,greater <int > >qmin;  //小顶堆
11         int cnt;
12         int n;
13         scanf("%d%d",&cnt,&n);
14         printf("%d %d\n",cnt,(n/2+1));
15         for(int i=1;i<=n;i++)
16         {
17             int mid;
18             scanf("%d",&mid);
19             if(qmin.size()==0)
20                 qmin.push(mid);
21             else
22             {
23                 if(mid>qmin.top())
24                     qmin.push(mid);
25                 else qmax.push(mid);
26             }
27             while(qmin.size()!=qmax.size() && qmin.size()!=qmax.size()+1)  //这两个条件任意一个不满足就要跳出来
28             {
29                 if(qmax.size()>qmin.size())
30                 {
31                     int x=qmax.top();
32                     qmax.pop();
33                     qmin.push(x);
34                 }
35                 else
36                 {
37                     int x=qmin.top();
38                     qmin.pop();
39                     qmax.push(x);
40                 }
41             }
42             /*
43             经过上面的while处理后,qmin里面放的是大于等于中位数的数,qmax里面放的是比中位数小的数
44             因为qmin是小顶堆,那么qmin.top()肯定就是中位数
45             (上面的话是在中位数的前提下)
46             */
47             if(i&1)
48                 cout << qmin.top();
49             if((i+1)%20==0||i==n)
50                 cout << endl;
51             else if(i&1)
52                 cout << " ";
53         }
54     }
55     return 0;
56 }

 

posted @ 2020-04-29 21:30  kongbursi  阅读(212)  评论(0编辑  收藏  举报