HDU 4006 第K大元素(小技巧)
来源:互联网 发布:centos 离线安装redis 编辑:程序博客网 时间:2024/05/20 23:08
题意
输入一些数,进行多次查询。每次查询都是查询第K大元素是什么。
题解
这道题考察的是堆(优先队列)的应用。。。。核心代码10行,主要是考察思想。既然每次都是查询第K大元素,那么就做一个最小堆,大小为K。每次增加元素都尝试放入这个最小堆,如果新增加的元素比这个最小堆的最小值要大,则把新元素插入最小堆,并将移除原来的最小值。这样的话,每次取出来的最小值就是第K大的元素。
额外的尝试
c++ STL 有个nth-element,利用类似快排的思想,查找第N个小的数,并把比他小的放在前面,比他大的放在后面(随机顺序)。很可惜,这种算法效率还不够高,TLE。。。
代码
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<string>#include<set>#include<map>#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h;i>l;i--)#define W(a) while(a)#define INF 0x3f3f3f3fusing namespace std;priority_queue<int,vector<int>,greater<int>> que;int main() { int n,k; while(~scanf("%d%d",&n,&k)) { while(!que.empty()){ que.pop(); } int pos=0; W(n--) { char ch[10]; scanf("%s",ch); if(strcmp(ch,"I")==0) { int x; scanf("%d",&x); if(que.size()<k) { que.push(x); } else if(que.top()<x){ que.pop(); que.push(x); } }else{ printf("%d\n",que.top()); } } } return 0;}
阅读全文
0 0
- HDU 4006 第K大元素(小技巧)
- 第k大元素
- 第k大元素
- 第k大元素
- 第K小元素
- 第 k 小 元素
- 寻找第k小的元素或者第k大的元素 -- O(n)
- 快排找第k大(小)元素
- 在随机序列中,利用冒泡排序查找第K小(或者第K大)的元素
- 第K小元素问题(C++)
- 数组中第k大(或小)的元素(leetcode215)
- 求数组中给定下标区间内的第K小(大)元素
- 寻找给定区间内的第k小(大)的元素
- 求两个已排序的数组中所有元素的第K大(小)
- Hdu 4006 The kth great number (第k大元素 优先队列的几种写法)
- 查找数组中第K大和第K小的元素
- 线性时间选择第K小元素(随机化选择第K小元素)C++
- LintCode 第K大元素
- Java基础----接口
- android 解决webView页面双击出现复制剪切等
- LSettingView--- 让你更加快速的实现设置界面
- JVM参数:-XX:CompileCommand
- poj 3321 Apple Tree(树状数组)
- HDU 4006 第K大元素(小技巧)
- Linux目录结构说明
- Java NIO系列教程(二) Channel
- 数量金融学(7):连续复利
- c++学习 有用的连接
- Java基础-----多态
- 来自Google的TCP BBR拥塞控制算法解析
- 最通俗易懂的使用OkHttp进行WebSocket连接教程:上来直接撸代码
- 171. Excel Sheet Column Number