用優先級隊列做的,由於一個細節問題,貢獻了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;
}