动态中位数
首先理解题意,是很重要的。刚开始,我都看不懂输出,这就需要看题目动态中位数,当输入的数集为奇数时,就输出一个中位数。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t,n,m,k;
cin>>t;
while(t--)
{
int cnt=0;
cin>>n>>m;
cout<<n<<" "<<(m+1)/2<<endl;
priority_queue<int> down;//大顶堆,放小的
priority_queue<int,vector<int>,greater<int> > up;//小顶堆,放大的
for(int i=1;i<=m;i++)
{
cin>>k;
if(down.empty()||k<down.top())
down.push(k);
else
up.push(k);
if(down.size()>up.size()+1) up.push(down.top()),down.pop();//维护平衡,使down比up多一或相等,i为奇数时大一
if(down.size()<up.size()+1) down.push(up.top()),up.pop();
if(i%2) //为奇数时
{
cout<<down.top()<<" ";//此时中位数为down中最大的
if(++cnt%10==0) cout<<endl;
}
}
if(cnt%10) cout<<endl;
}
}