您的位置:首页 > 其它

pku1442 Black Box

2010-06-11 18:37 204 查看
用优先级队列做的,由于一个细节问题,贡献了N次的RE

问题就是要求动态的查询第 k小的数,k由1开始递增

做法是用两个优先级队列 (也可以说是堆),一个最大优先级队列,一个最小优先级队列

由于是求第k小的数,所以每次查询的时候保持最大堆有有前k小的数就行了 然后返回qMax.top()

为了提取这前k小的数,所以我们一开始把数加入到qMin中,由qMin来返回前k小的数

要注意的一点是,队列为空的时候调用 top() 就会出现RE了 我就是因为这个RE了好几次

代码:

#include <iostream>

#include <queue>

#include <cstdio>

using namespace std;

int num[30010];

int main()

{

int n,m;

while (EOF!=scanf("%d%d",&n,&m))

{

priority_queue<int,vector<int>,greater<int> > qMin;

priority_queue<int> qMax;

int i(0);

while(i<n)

scanf("%d",num+i++);

int x;

int j;

for(i=0,j=0;i<m;++i){

scanf("%d",&x);

while(j<x)qMin.push(num[j++]);

qMax.push(qMin.top()); //保证qMax中有x个数,然后和qMin比较,提取前k小的数

qMin.pop();

if(!qMin.empty()){ //必须保证qMin非空

while(qMax.top()>qMin.top()){

qMax.push(qMin.top());

qMin.push(qMax.top());

qMax.pop();

qMin.pop();

}

}

printf("%d/n",qMax.top()); //输出前k小数中最大者

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: