(JAVA后台开发)阿里实习笔试3.30场AC代码第一题

(JAVA)阿里实习笔试3.30场AC代码第一题

第一题:N个养鸡场,每个鸡场有Ni只鸡,每天每个鸡场增加K只鸡,每天结束时卖掉鸡最多的那个场的所有鸡的一半,求M天后剩余鸡总数:

优先队列:
https://blog.csdn.net/weixin_36888577/article/details/79937886
优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

priority_queue<int, vector, less > pq;
这是个降序队列

1题:模拟,采用优先队列来执行整个过程,时间复杂度O(mlogn)
首先构造优先队列(大顶堆),维护M次即可。
注意:每次我们只需要维护队头元素,而不需要对所有元素都在每次循环中都更新数据
每次队头元素出队,值改为(当前值-当前是第几天*每天的增长量)/2(实际上这个更新是相对大小的更新)
最后,我们再把这个值与所有鸡场*总天数*每天增长值相加,就得到了绝对的结果

#include<iostream>
#include<queue>
using namespace std;
int resud(priority_queue<int, vector<int>, less<int> > pq, int n, int m, int k) {
    int i, tmp;
    int res = 0;
    for(i = 0; i < m; i++) {
        tmp = (pq.top() - (i+1)*k)/2;
        pq.pop();
        pq.push(tmp);
    }
     
    for(i = 0; i < m; i++) {
        res = res + pq.top();
        pq.pop();
    }
    return res + n*m*k;
}
 
int main() {
    int n,m,k;
    cin>>n>>m>>k;
    priority_queue<int, vector<int>, less<int> > pq;
     
    int i;
    int tmp;
     
    for(i = 0; i < n; i++) {
        cin>>tmp;
        pq.push(tmp);
    }
    cout<<resud(pq, n, m, k)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值