标签:ons 题意 market first 贪心 pop 并且 过期 scan
# 题意
n件商品,每个商品有利润p[ i ]和过期时间d[ i ],每天只能卖一件商品,合理安排每天卖的商品,求最大收益
# 题解
贪心做法,将所有商品按照过期时间的大小排序,从小到大依次将商品加入小根堆(p为键值)
加入p[i]时:
1.如果p[i]的时间大于堆中元素的个数,则放入堆
2.如果当前时间等于堆中的元素个数,并且当前元素的利润大于小根堆的堆顶元素,将两者互换
3.小于堆中的元素就不用加入
显然,局部最优解的递推可以得到整体最优解
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=1e4+10;
4 typedef pair<int,int>PII;
5 int main(){
6 int n;
7 while(scanf("%d",&n)!=EOF) {
8 PII p[N];
9 for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].second, &p[i].first);
10 priority_queue<int, vector<int>, greater<int>> h;
11 sort(p + 1, p + n + 1);
12 for (int i = 1; i <= n; i++) {
13 if(p[i].first==h.size()&&h.top() < p[i].second)
14 {
15 h.pop();
16 h.push(p[i].second);
17 }
18 else if(p[i].first > h.size()) h.push(p[i].second);
19 }
20 int ans=0;
21 while (h.size()) {
22 ans += h.top();
23 h.pop();
24 }
25 printf("%d\n", ans);
26 }
27 }
标签:ons 题意 market first 贪心 pop 并且 过期 scan
原文地址:https://www.cnblogs.com/hhyx/p/12495744.html