【Running Median】
链接:https://ac.nowcoder.com/acm/contest/1001/D
来源:牛客网
For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output the median (middle value) of the elements received so far.
【代码】
#include<iostream>
using namespace std;
#include<queue> //使用队列
int main ()
{
int p;
cin>>p;
while(p--)
{
priority_queue<int,vector<int>,less<int> > x; //优先队列,最大值优先
priority_queue<int,vector<int>,greater<int> > y; //优先队列,最下值优先
int q,m;
cin>>q>>m;
int a[m+5],b[m+5];
int ans=0;
for(int i=1;i<=m;i++)
{
cin>>a[i];
if(i==1)
y.push(a[i]);
else
{
if(y.top()>a[i])
x.push(a[i]); //如果队顶元素大于a[i],将a[i]接到队列x的末端
else
y.push(a[i]);
}
if(x.size()-y.size()==3) //如果x比y多三个元素,则将x队首元素弹出,并插入y队尾
{
int w=x.top();
x.pop();
y.push(w);
}
if(y.size()-x.size()==3)
{
int w=y.top();
y.pop(); //弹出队列的第一个元素
x.push(w);
}
if(y.size()-x.size()==1) //如果y中的元素比x中多一个,输出y中的队首元素
{
b[ans++]=y.top();
}
if(x.size()-y.size()==1)
{
b[ans++]=x.top();
}
}
cout<<q<<" "<<ans<<endl; //输出数据集的序号和它的中位数
for(int i=0;i<ans;i++)
{
if(i%10==0&&i!=0) //进行换行处理,输出的每行不能大于十个数
cout<<endl;
cout<<b[i]<<" ";
}
cout<<endl;
}
return 0;
}
【感悟】
本题运用队列的知识来解决,通过优先队列的最大值优先和最小值优先来生成新的队列,将a[i]和队顶元素比较,大于队顶元素输入到y队列中,不然就输入到x队列中,最后,访问元素个数的差值来决定输出的队列。