• 求最大k个数


    这里k==100


    #include <cstdio>

    #include <string>
    #include <cmath>
    #include <queue>
    #include <iostream>
    using namespace std;

    int main()
    {
        //默认是大顶堆
        priority_queue<int> q;
        int n, t;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%d", &t);
            q.push(t);
        }
        bool first=true;
        int cnt=100;
        while (!q.empty() && cnt>0)
        {
            if(first)
            {
                printf("%d", q.top());
                first=false;
            }
            else
            {
                printf(" %d", q.top());
            }
            q.pop();
            --cnt;
        }
        printf("
    ");
        return 0;
    }


    前面算法由于queue保存了所有的数据,所以比较速度和内存占用比较大,还可以优化。
    思想是,只保留最大的k个。 这样就要用最小堆,每次入队后,把最小的删除。 最后倒序输出
    优化后代码如下:

    #include <cstdio>

    #include <string>
    #include <cmath>
    #include <queue>
    #include <list>
    #include <iostream>
    using namespace std;

    const int cnt=100;
    int main()
    {
        //默认是大顶堆, 改为最小堆。 小的在前
        priority_queue<int, vector<int>, greater<int> > q;
        int n, t;
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%d", &t);
            q.push(t);
            // 超过100个,就把前面小的剔除,剩余的就是我们要的大的100个,每次插入就只要跟最大的100个比较
            if(q.size()>cnt)
                q.pop();
        }
        // 由于目前小的在前,大在后,所以需要倒序。先塞入到vector里面
        vector<int> res;
        while (!q.empty()) {
            res.push_back(q.top());
            q.pop();
        }
        //倒序输出
        for(vector<int>::reverse_iterator it = res.rbegin(); it!=res.rend(); ++it)
        {
            if(it==res.rbegin())//first one
                printf("%d", *it);
            else
                printf(" %d", *it);
        }
        printf("
    ");
        return 0;
    }

    image
    发现速度没提高多少,但是内存小了很多。

  • 相关阅读:
    P1509 找啊找啊找GF
    P1508 Likecloud-吃、吃、吃
    P1493 分梨子
    P1507 NASA的食物计划
    Java简单从文件读取和输出
    服务器和普通用户电脑的区别
    readUTF()和writeUTF()
    js中substring和substr的用法
    AfxMessageBox和MessageBox差别
    POJ 3691 &amp; HDU 2457 DNA repair (AC自己主动机,DP)
  • 原文地址:https://www.cnblogs.com/cute/p/13447340.html
Copyright © 2020-2023  润新知