zoukankan      html  css  js  c++  java
  • AcWing

    https://www.acwing.com/problem/content/147/

    有n个商品,商品有价格和过期时间,在过期时间之前才可以卖出,每天只能卖一个。求最大利润。

    假如直接对过期时间排序然后贪心会WA。事实上先把所有物品按过期时间排序,把商品的价格放进小顶堆里面,检测到一个商品的过期时间<当前堆的大小时,说明现在的时间不够出售所有的商品,就把价格最小的丢掉。为什么这样的对的呢?每次调整完之后堆里的东西要么是卖得完还充裕的,那么剩下的商品之间填充多出来的时间。否则是(当前时间点)刚刚好够的,每个物品都能找到在他过期之前的一个时间卖出。

    假如新加进去的商品价格最低,直接把它丢了。否则我换出一个商品,这个商品不是新加进去的,那么被换出的位置肯定足够容纳新来的那个商品。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    pair<int, int> p[10005];
    priority_queue<int, vector<int>, greater<int> > pq;
    
    int main() {
    #ifdef Yinku
        freopen("Yinku.in", "r", stdin);
    #endif // Yinku
        int n;
        while(~scanf("%d", &n)) {
            for(int i = 1; i <= n; ++i) {
                int x, y;
                scanf("%d%d", &x, &y);
                p[i] = {y, x};
            }
            sort(p + 1, p + 1 + n);
            for(int i = 1; i <= n; ++i) {
                pq.push(p[i].second);
                while(p[i].first < pq.size())
                    pq.pop();
            }
            ll sum = 0;
            while(!pq.empty()) {
                sum += pq.top();
                pq.pop();
            }
            printf("%lld
    ", sum);
        }
    }
    
  • 相关阅读:
    Kafka发送和接收消息
    Kafka主题topic的增删改查
    Kafka启动
    synchronize底层实现原理
    StringBuffer和StringBuilder的区别
    常见的排序算法
    Redis缓存穿透,缓存击穿,缓存雪崩原理及解决方案
    Redis持久化策略
    redis支持的数据类型
    Bytes 类型
  • 原文地址:https://www.cnblogs.com/Inko/p/11515413.html
Copyright © 2011-2022 走看看