hdu4006
2016-08-04 19:53
260 查看
大致题意:给出n个操作,每次选择插入数字或者询问已经给出数字中第k大的数,k给定
测试案例:
input:
8 3
I 1
I 2
I 3
Q
I 5
Q
I 4
Q
output:
1
2
3
解题思路:由于这题只需要求一个第k大的数,k已经给定,那么可以建立一个排序树,树中只存前k大的数,当遇到插入操作时,如果插入数小于第k大的数那么对询问没任何影响,不予理会,如果大于第k大的数,那么删除树中最小的数将其插入即可。
代码:
测试案例:
input:
8 3
I 1
I 2
I 3
Q
I 5
Q
I 4
Q
output:
1
2
3
解题思路:由于这题只需要求一个第k大的数,k已经给定,那么可以建立一个排序树,树中只存前k大的数,当遇到插入操作时,如果插入数小于第k大的数那么对询问没任何影响,不予理会,如果大于第k大的数,那么删除树中最小的数将其插入即可。
代码:
//集合默认排序从小到大 #include <iostream> #include <cstdio> #include <cstring> #include <set> using namespace std; int main() { multiset<int> s; multiset<int>::iterator it; int n,k,t; char ch; while (scanf("%d%d",&n,&k)==2) { s.clear(); int i=0; while (i<k) { scanf("%c",&ch); if (ch=='I')//先在multiset中存入k个数 { scanf("%d",&t); s.insert(t); i++; } } while(i<n) { scanf("%c",&ch); if (ch=='I') { scanf("%d",&t); it=s.begin();//集合默认排序从小到大 if (t>*it)//插入数大于集合中最小的数 { s.erase(it);//删除集合中最小的数 s.insert(t); } i++; } else if (ch=='Q') { it=s.begin(); printf("%d\n",*it); i++; } } } return 0; }
相关文章推荐
- hdu4006
- js中定义对象的几种形式
- Eclipse下Android的DDMS中的的Abd问题
- 搞懂UTF-8 和 GBK
- SQL语句分页
- 20款最好用的wordpress图片相册插件
- SpringMVC简介
- HDU2579
- ASP.NET Core - 中间件与管道(1)
- 带你了解C语言指针
- android屏幕适配
- Linux 开放指定服务端口
- Unity Shader Example 15 (Gerstner Wave)
- StatusBarUtil 状态栏工具类(实现沉浸式状态栏/变色状态栏)
- Android初级教程:单击事件的传递机制初谈
- Android初级教程:单击事件的传递机制初谈
- ※ Leetcode - Array - 88. Merge Sorted Array(快速归并两个有序数组)
- C语言:用异或^实现数据加密
- C#forUnity快速入门(连载15)_C#委托与事件
- Radix树 与 Linux IDR机制