题解 | 小苯的比赛上分

小苯的比赛上分

https://www.nowcoder.com/practice/f5c52183dfb148489321f881239216c1

出题人真是神了

拿我noob109写的双端优先序列复制过来,然后根据题意编写一下主函数就可以了

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

class double_ended_priority_queue
{
private:
//创建两个主堆

    //最小堆
    priority_queue<int,vector<int>,greater<int>> min_pq;
    //最大堆
    priority_queue<int> max_pq;


//创建两个待删除堆,用来记录需要从对方堆中删除的元素

    //最小堆删除堆
    priority_queue<int,vector<int>,greater<int>> min_to_delete;
    //最大堆删除堆
    priority_queue<int> max_to_delete;


//创建清除函数

    //最小堆清除函数,删除所有标记为待删除的堆顶元素
    void clean_min_pq()
    {
        //两个堆都不为空,同时堆顶元素相同
        while (!min_pq.empty() && !min_to_delete.empty() && min_pq.top() == min_to_delete.top())
        {
            min_pq.pop();
            min_to_delete.pop();
        }
    }

    //最大堆清除函数,删除所有标记为待删除的堆顶元素
    void clean_max_pq()
    {
        //两个堆都不为空,同时堆顶元素相同
        while (!max_pq.empty() && !max_to_delete.empty() && max_pq.top() == max_to_delete.top())
        {
            max_pq.pop();
            max_to_delete.pop();
        }
    }



public:
    //插入函数:将元素同时插入最大堆与最小堆
    void push(int x)
    {
        min_pq.push(x);
        max_pq.push(x);
    }


//创建获取函数

    //最小值获取函数
    int get_min()
    {
        clean_min_pq();  //先清除最小堆待删除元素,防止被获取
        if (min_pq.empty())
        {
            return -1;
        }
        //获取最小堆的顶部元素,即最小值
        int min_num = min_pq.top();
        return min_num;
    }

    //最大值获取函数
    int gei_max()
    {
        clean_max_pq();  //先清除最大堆待删除元素,防止被获取
        if (max_pq.empty()) 
        {
            return -1;
        }
        //获取最大堆顶部元素,即最大值
        int max_num = max_pq.top();
        return max_num;
    }


//创建删除函数

    //最小值删除函数
    void min_pop()
    {
        clean_min_pq();  //依旧先清理
        if (min_pq.empty())
        {
            return;
        }
        //获取要删除的值
        int num_to_delete = min_pq.top();
        //获取后从最小堆中删除
        min_pq.pop();
        //将获取的值加入最大堆待删除列表
        max_to_delete.push(num_to_delete);
    }

    //最大值删除函数
    void max_pop()
    {
        clean_max_pq(); //清理
        if (max_pq.empty())
        {
            return;
        }
        //获取要删除的值
        int num_to_delete = max_pq.top();
        //获取后从最大堆删除
        max_pq.pop();
        //将获取到的值加入最小堆待删除列表
        min_to_delete.push(num_to_delete);
    }


//检查队列是否为空 (这里也可以换成检测最大堆,两个是一样的)
    bool empty()
    {
        //先清理最小堆
        clean_min_pq();  
        //如果最小堆为空,则队列为空
        return min_pq.empty();
    }
};

int main() {
    int n = 0,m = 0;
    cin >> n >> m;
    //创建双端序列
    double_ended_priority_queue scores;
    //将所有账户分数放入双端序列
    for (int i = 0;i < n;i++)
    {
        int accout_score = 0;
        cin >> accout_score;
        scores.push(accout_score);
    }
    //开始比赛,依次处理
    for (int i = 0;i < m;i++)
    {
        //打完增加的分数
        int add_score = 0;
        cin >> add_score;
        //目前所有账户中最小的分数
        int min_score = scores.get_min();
        //获取后删去防干扰
        scores.min_pop();
        min_score += add_score;
        scores.push(min_score);
        cout << scores.gei_max() << "\n";
    }
    return 0;
}

全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
一共一个小时,面试难度以及自己的回答算是最近的面试压力比较大的,实习问了30分钟,中间穿插八股。1.redis数据结构2.redis持久化机制3.mysql索引底层4.聚簇索引与非聚簇索引5.索引优化6.索引失效7.mysql执行一条sql8.那么多索引mysql怎么选(不会)9.tcp与udp区别10.tcp为什么可靠11.消息队列作用12.kafka怎么保证消息有序性13.mcp是什么?14.skills是什么?15.jvm内存分配与回收过程(我讲了从创建对象到判断垃圾对象到垃圾回收我全说了一遍,是这个吗?)16.fullgc触发机制17.tcp的拥塞控制流程(不会了)18.分布式事务解决方案,说了2pc,3pc,tcc。算法是反转双向链表,没有按格式输出,但是面试官没让继续写了,面完以为挂了,结果晚上秒过,看看复试什么情况吧。今天百度打电话准备发offer了,业务跟在手子的差不多,很垂,并且说不分日常暑期,只看表现,会有转正机会,但是考虑再三还是拒绝了,百度实习薪资确实有点低,title也不如之前了,但是面试的二位业务老师我很喜欢,对我的评价也不错,希望之后能有机会共事。从三月份到现在一共面了六家,面试次数总共是8场,情况如下:脉脉二面(无答复,默认挂)百度二面已oc美团一面过,下周一二面shein一面过直接HR面游族一面过直接HR面腾讯一面过等待约二面滴滴明天一面面试通过率还是蛮高的,但是大部分都是日常,感觉对我现在的加成不大,大概率不会去,不知道暑期会是什么情况呢唉,希望能有面试吧,继续加油。字节被无hc直接取消了,现在还没人捞,有没有字节HR救救我
不管什么都不想跳动了:本人美团百度快手都待过,建议肯定是直接留快手多一点产出后转正or直接冲字节腾讯暑期吧。一是快手从福利到基建都吊打另外两家。美团现在这个业务比较惨,本来毛利就很低,亏损严重,今年很可能要优化人力降低成本,去了别说日常,就算暑期后面都很可能被优化。百度其实实习生权限挺高的,可以接触到一些含金量高的项目,但是现在的风评不如之前了,薪资也不高。二是转正概率和薪资是跟产出挂钩的,你都在手子已经积累产出了,去其他家日常实习产出都是从0开始,肯定不可能有你在手子转正可能性大啊,现在日常压根没必要去,而且我有两个师弟都是在快手日常转正的,不用太担心,安心留在手子一边多做一点产出然后一边冲字节腾讯暑期,字节腾讯今年实习岗位非常多的,不如好好把握这个,加油。
查看18道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务