数据结构基础+STL--第k大

来源:互联网 发布:苹果cms添加广告 编辑:程序博客网 时间:2024/05/01 06:57

Description

Xiao Ming andXiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose towrite down a number, or ask Xiao Bao what the kth great number is. Because thenumber written by Xiao Ming is too much, Xiao Bao is feeling giddy. Now, try tohelp Xiao Bao.

Input

There areseveral test cases. For each test case, the first line of input contains twopositive integer n, k. Then n lines follow. If Xiao Ming choose to write down anumber, there will be an " I" followed by a number that Xiao Mingwill write down. If Xiao Ming choose to ask Xiao Bao, there will be a"Q", then you need to output the kth great number. 

Output

The output consistsof one integer representing the largest number of islands that all lie on oneline. 

Sample Input

8 3

I 1

I 2

I 3

Q

I 5

Q

I 4

Q

Sample Output

1

2

3

即当输入I时更新数列,输入Q时输出第m大

利用建堆的方式来存储数据及排序

priority_queue<Type,Container, Functional>
其中Type为数据类型,Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。

priority_queue<int>q;//默认为递增排序,大顶堆

priority_queue<int ,vector<int>,greater<int> >q;//递减排序,小顶堆
priority_queue<int ,vector<int>,less<int> >q;//递增排序
 

代码:

#include<iostream>

#include<vector>

#include<queue>

using namespace std;

int main()

{

   int n,k,i,a;

   char s[2];

   while(scanf("%d %d",&n,&k)==2)

    {

       priority_queue<int ,vector<int>,greater<int> >q;//定义递减的堆

       for(i=1;i<=n;i++)

       {

           scanf("%s",s);

           if(s[0]=='I')

           {

                scanf("%d",&a);

                q.push(a);

                if(q.size()>k)//仅保存前k小的数据

                    q.pop();

           }

           else

               printf("%d\n",q.top());

       }

    }

   return 0;

}

原创粉丝点击