题目链接
题意
给出一个数组,求前n个数的中位数,n为奇数
思路
- 对顶堆的思想,设置一个大根堆和一个小根堆,大根堆维护小的数,小根堆维护大的数,若当前数小于小根堆的堆顶,则插入大根堆
- 需要维护两个堆的数量差,不能大于1
- priority_queue <int,vector,greater > q1 小根堆
- priority_queue <int,vector,less > q2 大根堆
参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
cin>>t;
while(t--)
{
int s,n;
cin>>s>>n;
cout<<s<<" "<<(n+1)/2<<endl;
priority_queue <int,vector<int>,greater<int> > q1;
priority_queue <int,vector<int>,less<int> > q2;
int tmp;
cin>>tmp;
q1.push(tmp);
cout<<tmp<<" ";
for(int i=2; i<=n; i++)
{
cin>>tmp;
if(tmp>=q1.top())
{
q1.push(tmp);
}
else
{
q2.push(tmp);
}
if(q1.size()>q2.size()+1)
{
q2.push(q1.top());
q1.pop();
}
if(q2.size()>q1.size()+1)
{
q1.push(q2.top());
q2.pop();
}
if(i%2==1)
{
if(q2.size()>q1.size())
{
cout<<q2.top()<<" ";
}
else
{
cout<<q1.top()<<" ";
}
}
if(i%20==0)
cout<<endl;
}
cout<<endl;
}
}