【程序设计大赛刷题记录】C语言 08

【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队列中,最后,访问元素个数的差值来决定输出的队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值