【HDU No. 4006】 第k 大的数 The kth great number

杭电OJ 题目地址

【题意】

小明和小宝正在玩数字游戏。游戏有n轮,小明在每轮中都可以写一个数,或者问小宝第k 大的数是什么(第k 大的数指有k -1个数比它大)。

游戏格式为:

  • I c ,表示小明写下一个数c ;
  • Q,表示小明问第k 大的数。

请对小明的每个询问都给出第k 大的数。

【输入输出】

输入:

输入包含多个测试用例。每个测试用例的第1行都包含两个正整数n 、k (1≤k ≤n ≤1000000),表示n 轮游戏和第k 大的数。然后是n 行,格式为I c 或Q。

输出:

对每个询问Q,都单行输出第k 大的数。

【样例】

提示: 当写下的数字个数小于k 个时,小明不会问小宝第k 大的数。

【思路分析】

这道题数据范围很大,直接暴力肯定超时,因此可以借助优先队列实现。

【算法设计】

① 使用优先队列(最小值优先)存储最大的k 个数。

② 插入。若队中元素个数小于k ,则直接入队;若当前输入元素大于队头,则队头出队,当前元素入队。

③ 查询。队头(堆顶)就是第k 大的数,输出即可。

【举个栗子】

根据输入样例,操作过程如下。

① 插入。I 1:元素个数小于3,直接入队。I 2:元素个数小于3,直接入队。I 3:元素个数小于3,直接入队。

② 查询。查询第3大的数,队头1为第3大的数。数字3是第1大。

③ 插入。I 5:元素个数不小于3,5比队头大,则队头出队,5入队。

④ 查询。查询第3大的数,队头2为第3大的数。

⑤ 插入。I 4:元素个数不小于3,4比队头大,则队头出队,4入队。

⑥ 查询。查询第3大的数,队头3为第3大的数。

【算法实现】

#include<iostream>
#include<cstdio>
#include<functional>//提供比较函数greater<int>
#include<queue>using namespace std;int main(){int i,n,k,num;char c;priority_queue<int,vector<int>,greater<int> >q;//小顶堆 while(~scanf("%d%d",&n,&k)){while(q.size())//初始化队列为空 q.pop();             for(i=1;i<=n;i++){cin>>c;if(c=='I'){scanf("%d",&num);if(q.size()<k) //堆中元素个数小于kq.push(num);else if(q.top()<num) //当堆顶小于输入元素时q.pop(),q.push(num);//堆顶出队,元素入队}                        //堆中永远保存最大的k个元素 elseprintf("%d\n",q.top()); //堆顶即为第k大元素}}return 0;
}

【HDU No. 4006】 第k 大的数 The kth great number相关推荐

  1. C++的STL 堆 实现获取数组堆第K大的数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...

  2. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  3. 海量无序数据寻找第 K 大的数

    前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...

  4. C++实现求数组中前K大的数

    参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...

  5. 51nod 1105:第K大的数

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

  6. 关于求N个无序数中第K大的数。

    关于求N个无序数中第K大的数. 2012-03-16 来源:小木虫作者: SmallWarm 昨天去面试,有一题是要求求N个无序数中第K大的数.当时灵感激发,突然想到了快速排序,后来在百度上面一查,已 ...

  7. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  8. 【算法与数据结构】在n个数中取第k大的数(基础篇)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 题目介绍           在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些以 ...

  9. 第k大的数 java_一道算法题:第K大的数

    给一个无序的包涵n个元素的数组,找出其中第k大的数(n > k). 初看到这个题的时候,作为一个写了一段时间java的人,立刻能想到的一种解法就是: class Solution { publi ...

最新文章

  1. 用python编写脚本实现备份文件
  2. ES5和6的一些新特性
  3. CCNA 之 三 TCP/IP 及 子网划分
  4. oracle中的备注的配置与查询
  5. 链路层的封装方式与IP选路 (二)
  6. 一段java并发编程代码
  7. JS Math.round()方法原理
  8. pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码
  9. 【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)
  10. 买了一块烂砖头(《ADO.NET技术内幕》)- 以及今天看砖头的一些感想(技术感想)...
  11. 2020中国移动创客马拉松大赛移动云专题赛决赛成功举办
  12. 【C++】max_element() 和 min_element()
  13. java+opencv+intellij idea实现人脸识别
  14. 几种支持动作模型格式的比较(MD2,MD5,sea3d) 【转】
  15. HashSet的自定义实现
  16. 方法重写和方法重载的区别
  17. 【草莓音乐节】现场美女大放送
  18. 如何在Word2010中设置不一样的稿纸
  19. 穆易天气app代码(二)
  20. windows的命令行工具和DOS工具的区别

热门文章

  1. 应用型本科如何找好工作
  2. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)
  3. PostgreSql处理Null与空字符串
  4. opencv大坑之BGR
  5. matlab 调用GPU运算
  6. matlab运行慢cpu低,为什么我的GPU运算速度低于CPU运算速度???
  7. 小红书图文笔记怎么发?小红书笔记发布要添加话题吗
  8. 1080 Graduate Admission (30分)
  9. 取消使屏幕倒过来的快捷键Alt+Ctrl+方向键
  10. java调用阿里云实现短信推送