首页 > 代码库 > HDU 4006 The kth great number(multiset(或者)优先队列)
HDU 4006 The kth great number(multiset(或者)优先队列)
题目
询问第K大的数
//这是我最初的想法,用multiset,AC了——好吧,也许是数据弱也有可能
//multiset运用——不去重,边插入边排序//iterator的运用,插入的时候,如果是相同的数没直接放在相同的现有的数据后面的#include<cstdio>#include<cstring>#include<algorithm>#include<set>using namespace std;//#define IN freopen("c:\\Users\\nit\\desktop\\input.txt", "r", stdin)//#define OUT freopen("/home/nit/output.txt", "w", stdout)//int gcd(int a,int b){return b==0?a:gcd(b,a%b);}int main(){ multiset<int>ms; multiset<int>::iterator it; int n,k,a; char q[10]; while(~scanf("%d%d",&n,&k)) { ms.clear(); int yi=1; for(int i=0;i<n;i++) { scanf("%s",q); if(q[0]==‘I‘) { scanf("%d",&a); ms.insert(a); if(yi==0) { if(a>=*it)//如果比现有的第k大的数大,就更新 it++; } } else { if(yi){ yi=0; a=k; for(it=ms.end();a!=0;it--,a--); printf("%d\n",*it); } else { printf("%d\n",*it); } } } } return 0;}
/*
后来百度上别人的思路,用优先队列:
struct Node
{
int x;
friend bool operator < (Node a,Node b)
{
return a.x > b.x;
}
};
priority_queue <Node> q;
主要用于重载小于号,让小的优先.
输入时先输入k个数,输入k个数后再输入时需要判断输入的数与队头的大小关系.
输入数小于队头则不进队.
输入数大于队头则进队,弹出队头.
保证优先队列中只有k的元素.
而队头是k个元素中最小的元素.
即第k大元素
好吧,我觉得也蛮好的
这是网址:http://www.cnblogs.com/zxotl/archive/2012/09/02/2667820.html
*/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。