31.食品
描述:

思路:
根据题意,每一次卖出的商品应该是滞留队列中价值价值最大的物品,这里的滞留队列应该就是m的大小,因此可以用一个优先级队列来保存每天滞留的物品。
这里可以定义一个结构体包保存当前的天数以及天数对应的滞留价值。每次取出天数最小且滞留价值最大的物品。
代码:
#include <bits/stdc++.h>
using namespace std;
struct Node {
int pos;
int val;
bool operator < (const Node& node) const{
return val == node.val ? pos > node.pos : val < node.val;
}
Node(int _pos,int _val):pos(_pos),val(_val){};
};
int main(){
int n,m;
cin >> n >> m;
// 存储滞留消耗的成本
long long cost = 0;
vector<int> c(n+1);
for(int i = 1;i <= n;i++){
cin >> c[i];
}
// 优先级队列
priority_queue<Node> q;
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;
}

浙公网安备 33010602011771号