题解 | #食品#

食品

https://www.nowcoder.com/practice/56cad3934cac465c8e0c24647ead487e

#include <bits/stdc++.h>

// 贪心 !

using namespace std;

typedef long long ll;


struct Node {
    int pos;
    ll val;
    bool operator <(const Node& node) const {
        return val == node.val ? pos > node.pos : val < node.val;
    }

    Node(int _pos, ll _val): pos(_pos), val(_val) {}

};

// 在每次出队列的时候,计算消耗! 
// 之前是抛出后 重新一次将队列元素加一次消耗,会超时!

int main() {
    int n, m;
    cin >> n >> m;
    vector<ll> c(n + 1);
    for (int i = 1; i <= n; i++) cin >> c[i];

    // 把 前 m 个商品 放到大顶堆中!
    priority_queue<Node> q;

    ll cost = 0;

    // m 天的时间已经消耗的存储成本!
    for (int i = 1; i <= m; i++) {
        q.push(Node(i, c[i])); // 单天成本最高的,最顶上呆着!
    }


    for (int i = m + 1; i <= n; i++) { // 每天生产新的后,直接入队列!
        q.push(Node(i, c[i]));

        Node top = q.top();

        q.pop(); // 卖掉单天储藏成本最高的!

        cost += top.val * (i - top.pos);
    }

    int cur = n;

    while (!q.empty()) {
        ++cur;
        Node top = q.top();
        q.pop();
        cost += top.val * (cur - top.pos);
    }

    cout << cost << endl;
    return 0;

}

全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务