黑匣子——KEY

2024-02-04 12:18
文章标签 key 黑匣子

本文主要是介绍黑匣子——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;
}

这篇关于黑匣子——KEY的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677471

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen