pku1442 Black Box

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

}

 

發佈了32 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章