poj--1442--black box

题目大意:有一个黑盒,每次往里面加一个数字,在加到特定数量的数字的时候询问第k小的数字

解题报告:学习了用优先队列来实现一个最大堆和一个最小堆来维护第K小的数字,细节有点麻烦。

参考:点击打开链接

#include<iostream>
#include<queue>
#include<cstdio>
#define maxn 30020
#define debug
using namespace std;
struct maxHeap
{
	int x;
	maxHeap(int x):x(x)
	{
		
	}
	bool operator <(const maxHeap & h)const
	{
		return x<h.x;
	}
};
struct minHeap
{
	int x;
	minHeap(int x):x(x)
	{
		
	}
	bool operator <(const minHeap &h)const{
		return x>h.x;
	}
};
priority_queue<minHeap>  miq;
priority_queue<maxHeap>  maq;
int n,m;
int a[maxn],u[maxn];
int ia,iu,ic;
void slove()
{
	iu=0;
	ic=0;
	int now=u[iu++];
	for(int i=1;i<=n;i++)
	{
		if(maq.size()<ic)
		{
			maq.push(maxHeap(a[i]));
			while(maq.size()<ic)
			{
				int num=miq.top().x;
				miq.pop();
				maq.push(maxHeap(num));
			}
		}
		else 
		{
			if(maq.empty())
			{
				miq.push(minHeap(a[i]));
			}
			else
			{
				int num=maq.top().x;
				if(a[i]<num)
				{
					maq.pop();
					miq.push(minHeap(num));
					maq.push(maxHeap(a[i]));
				}
				else
				miq.push(minHeap(a[i]));
			}
		}
		while(i==now&&iu<=m)
		{
			int num=miq.top().x;
			miq.pop();
			cout<<num<<endl;
			ic++;
			now=u[iu++];
			maq.push(maxHeap(num));
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(int i=0;i<m;i++)
		scanf("%d",&u[i]);
		slove();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值