首页 > 代码库 > 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;}
View Code

 

/*

后来百度上别人的思路,用优先队列:

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

*/