X-man

导航

hdu 4006 求第K大的数 优先队列

#include<stdio.h>
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    int n,m,k;
    char a;
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        priority_queue<int ,vector<int>,greater<int> >q;
        while(n--)
        {
            getchar();//接收空格键??容易忽略
            scanf("%c",&a);
            if(a=='I')
            {
                scanf("%d",&m);
                if(q.size()<k)q.push(m);
                else
                {
                    if(m>q.top())
                    {
                        q.pop();
                        q.push(m);
                    }
                }
            }
            else
            printf("%d\n",q.top());
        }
    }

    return 0;
}

  

      优先队列,优先队列默认是按从大到小排列的priority_queue<int> q;,如果想要按从小到大排列就:priority_queue<int,vector<int>,greater<int> > q;

这题主要就是维护一个长度为K的优先队列就行了:

I操作:每次遇到比队列里的最小值大的话就,把队顶元素删除,把这个值添加到队列中。

Q操作:直接输出队顶元素。

posted on 2013-04-03 21:36  雨钝风轻  阅读(269)  评论(0编辑  收藏  举报