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

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值