A - The kth great number HDU - 4006(set+vector+优先队列)

题目传送:走你~

题意简介:写下很多很多的数,当遇到Q时输出第k大的数。

分析:很多很多的数,则开数组行不通,需要STL。输出第k大的数,则需要对原数据进行排序。如果强行暴力排序则会T掉,

而且用set时需要注意的一点是,set自动忽略相同的数,而根据题意需要相同的数这里用到了multiset.

法一:multiset

#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1000100;

multiset<int> se;
int n, k, a, b;
char ch;
multiset<int>::iterator it;
int main()
{
    while(scanf("%d%d", &n, &k) != EOF)
    {
        se.clear(); // **不要忘记
        a = 0;
        for(int i = 0; i < n; i++)
        {
            getchar();
            ch = getchar();
            if(ch == 'I')
            {
                scanf("%d", &b);
                se.insert(b);
                a++;
                it = se.begin();
                if(se.size() > k) // 对set中数据进行维护,使他最多存有3个。
                    se.erase(it);
            }
            else
            {

                it = se.begin();
                printf("%d\n",*it);
            }

        }
    }
    return 0;
}

法二:优先队列

#include<bits/stdc++.h>
using namespace std;

int n, k, d;
char ch;
int main()
{
    while(scanf("%d%d", &n, &k) != EOF)
    {
        //其实和set很相似,简单的是方便维护最多3个数的队列
        priority_queue<int, vector<int>, greater<int> > pre;
        while(n--)
        {
            cin >> ch;
            if(ch == 'I')
            {
                scanf("%d", &d);
                pre.push(d);
                if(pre.size() > k)
                    pre.pop();
            }
            else
            {
                printf("%d\n", pre.top());
            }
        }

    }
    return 0;
}

法三:vector+查找插入,使其在输入时本身就有序。

#include<bits/stdc++.h>
using namespace std;

int n, k, d;
vector <int> vec;
char ch;
int main()
{
    while(scanf("%d%d", &n, &k) != EOF)
    {
        vec.clear();
        while(n--)
        {
            cin >> ch;
            if(ch == 'I')
            {
                scanf("%d", &d);
                int pos = lower_bound(vec.begin(), vec.end(), d) - vec.begin();
                vec.insert(vec.begin() + pos, d);
            }
            else
            {
                printf("%d\n", vec[vec.size() - k]);
            }
        }

    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值