超市 (0x15 二叉堆)

简介: 笔记

超市


题意

超市里有 N 件商品,每件商品都有利润 p i和过期时间 d i 每天只能卖一件商品,过期商品不能再卖。


求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。


思路

首先将所有商品按照过期时间非严格单调递增排序,然后遍历每一件商品。将 S 定义为已经选择要卖的商品的集合,如果将当前遍历到的商品 node[i] 加入集合后,集合的大小小于等于 node[i]的过期时间 d i那么符合继续遍历接下来的商品。否则,将当前集合中价值最小的商品移除,直到与 d i i相等为止


代码

#include<bits/stdc++.h>
// #define int long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
const int N = 1e5 + 10;
int n;
struct Node {
  int p, d;
};
void solve() {
  while (scanf("%d", &n) != EOF) {
    int res = 0;
    priority_queue<Node>pq;
    for (int i = 1; i <= n; ++i) {
      int p, d; cin >> p >> d;
      if (pq.size() < d)pq.push({ p, d });
      else {
        if (pq.size() && pq.top().p < p) {
          pq.pop();
          pq.push({ p, d });
        }
      }
    }
    while (pq.size()) {
      res += pq.top().p;
      pq.pop();
    }
    cout << res << endl;
  }
}
signed main() {
  // int t; cin >> t;
  // while (t--)
  solve();
  return 0;
}


目录
相关文章
|
算法 索引
带你拿捏链表
带你拿捏链表
124 0
|
5月前
|
存储
【海贼王的数据航海】链表—单链表
【海贼王的数据航海】链表—单链表
32 0
|
5月前
|
搜索推荐
【海贼王的数据航海】排序——直接选择排序|堆排序
【海贼王的数据航海】排序——直接选择排序|堆排序
23 0
|
5月前
|
存储 算法
【海贼王的数据航海】时间复杂度 | 空间复杂度
【海贼王的数据航海】时间复杂度 | 空间复杂度
22 0
|
5月前
【海贼王的数据航海】栈和队列
【海贼王的数据航海】栈和队列
28 0
|
5月前
|
存储 缓存
【海贼王的数据航海】链表—双向链表
【海贼王的数据航海】链表—双向链表
27 0
|
6月前
|
算法 测试技术 C#
【单调栈】LeetCode1776:车队
【单调栈】LeetCode1776:车队
|
算法
食物链问题(并查集)
食物链问题(并查集)
90 0
|
存储 算法 程序员
【马里奥数据结构吃“金币”】时间复杂度和空间复杂度
【马里奥数据结构吃“金币”】时间复杂度和空间复杂度
128 0
【马里奥数据结构吃“金币”】时间复杂度和空间复杂度
|
存储 C语言 C++
二叉树遍历就是这么简单(必杀)
二叉树遍历就是这么简单(必杀)
二叉树遍历就是这么简单(必杀)