您的位置:首页 > 其它

poj--1442--black box

2013-02-27 10:21 316 查看
题目大意:有一个黑盒,每次往里面加一个数字,在加到特定数量的数字的时候询问第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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: