超市 (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;
}


目录
相关文章
|
算法 索引
带你拿捏链表
带你拿捏链表
130 0
|
20天前
|
存储 关系型数据库 MySQL
索引与书架、新华字典的爱恨情仇
在MySQL中,索引是提升查询速度的关键技术。根据存储类型,索引分为聚簇索引和非聚簇索引。聚簇索引将数据按索引顺序存储在磁盘上,查询主键时效率极高;非聚簇索引则通过索引项指向实际数据位置,适用于多条件查询。本文详细解释这两种索引的工作原理及应用场景,并介绍InnoDB和MyISAM存储引擎的实现方式。
34 4
|
7月前
|
存储 缓存
【海贼王的数据航海】链表—双向链表
【海贼王的数据航海】链表—双向链表
33 0
|
7月前
|
存储
【海贼王的数据航海】链表—单链表
【海贼王的数据航海】链表—单链表
44 0
|
8月前
|
Go
实现双向链表的运势解读
【5月更文挑战第4天】我们实现了用Go语言处理周易卦象的功能。 这个项目结合了双向链表和周易知识,有助于理解两者并提供运势占卜功能。
44 0
|
8月前
|
存储 算法 C语言
[数据启示录 01] 线性表及其实现
[数据启示录 01] 线性表及其实现
61 0
|
8月前
校门外的树
校门外的树
30 0
|
8月前
|
算法 测试技术 C#
【单调栈】LeetCode1776:车队
【单调栈】LeetCode1776:车队
|
测试技术
蓝桥 晚会节目单 (线段树)
蓝桥 晚会节目单 (线段树)
牛客 买礼物(链表 线段树)
牛客 买礼物(链表 线段树)
70 0
牛客 买礼物(链表 线段树)

热门文章

最新文章