黑匣子——KEY

黑匣子

(box.pas/c/cpp)
【 问题描述】
某研究小组成员想发明一个黑匣子( 当然不是飞机上那个), 而是一个具有特殊功能
箱子。 这个箱子具有两个功能: 1. 存放一些正整数 x; 2. 对于第 k 次询问, 它会告
你箱子中第 k 小的数字是多少。 但光具有理论是不够的, 理论往往应联系实际。 这可是
个大大的难题, 没有丰富程序设计知识的同学们希望你能帮助他们写出这个程序代码, 以
他们能完成黑匣子的制作。
【 输入格式】
第一行, 一个数字 n 表示对黑匣子的操作次数。
以下 n 行, 每行一个数字。 若这个数字是正整数, 则表示在黑匣子中添加这个数字,
若这个数字是-­1, 这表示一次询问。
【 输出格式】
若干行, 对应每次询问所得的结果( 必定存在答案)
【 样例输入】
8 1 ­
-1
8 8 ­
-1
5 ­
-1
­-1
【 样例输出】
1
8
8
8
【 样例说明】
第一次询问时, 黑匣子内为 1, 输出最小的数 1;
第二次询问时, 黑匣子内为 1 8 8, 输出第二小的数 8;
第三次询问时, 黑匣子内为 1 5 8 8, 输出第三小的数 8;
第四次询问时, 黑匣子内为 1 5 8 8, 输出第四小的数 8。
【 数据范围】
对于30%的数据, 5<=n<=200
对于60%的数据, 5<=n<=10000
对于100%的数据, 5<=n<=100000, n为整数, x为不超过maxlongint的正整数。//膜拜Y’Ads,kmz

第一眼看到本题,就像到了排序。但是囿于数据范围,直接排序无法得到满分。
所以我们用堆来解决这道题。C++的queue库可以快速,便捷地为我们提供大根堆和小根堆。(注意小根堆的定义)
priority_queue<int,vector<int>,greater<int> >

那么我们应该如何实现呢?
首先,我们先开两个堆,一个大根堆,一个小根堆。每次输出(-1)时就将小根堆的top(堆顶)输出,并将小根堆top放入大根堆中,以保证地k小。
如果读入一个数,那就得进行判断,如果读入的x<大根堆top,则说明x为前k小的数,即此时第k小的数依旧为大根堆top(大根堆top就是k-1小的数),所以将x放入大根堆中,将大根堆top放入小根堆中。如果读入的x>大根堆的top,那就直接将x放入小根堆。
通过这些操作,就可以维护正确的k。下面是代码

#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
int i,j,k,n,m,tot,ans;
priority_queue<int> bh;
priority_queue<int,vector<int>,greater<int> > sh;
int main()
{
    scanf("%d",&n);int x;
    for(int j=1;j<=n;j++){
        scanf("%d",&x);
        if(x==-1){
            printf("%d\n",sh.top());
            bh.push(sh.top());
            sh.pop();continue;
        }
        if(!bh.empty()){
            if(x<=bh.top()){
               sh.push(bh.top());
               bh.pop();
               bh.push(x);
               continue;
            }
        }
        sh.push(x);
    }
    return 0;
}

转载于:https://www.cnblogs.com/stevensonson/p/7612221.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值