zoukankan      html  css  js  c++  java
  • 「题解」洛谷 P3545 [POI2012]HUR-Warehouse Store

    题目

    P3545 [POI2012]HUR-Warehouse Store

    简化题意

    每天你会收到一定量的货,以及一份订单,货物会累积,但订单只能当天决定是否接受,问最多接受多少份订单。

    思路

    贪心 + 优先队列。

    后面送来的货只能用于后面的订单。所以倒序考虑。

    倒序处理的时候将当天的订单的要求放入小根堆中,用当天送来的货物去满足该订单,如果不能满足给该订单减去一部分,如果能满足继续看小根堆中得下一个订单

    Code

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #define MAXN 250001
    
    int min(int a, int b) { return a < b ? a : b; }
    
    typedef std::pair<int, int> pii;
    std::priority_queue<pii, std::vector<pii>, std::greater<pii> > q;
    int n, cnt, a[MAXN], b[MAXN], ans[MAXN];
    
    int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
        for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);
        for (int i = n; i >= 1; --i) {
            q.push(std::make_pair(b[i], i));
            int now = a[i];
            while (!q.empty()) {
                pii t = q.top(); q.pop();
                int jian = min(t.first, now);
                t.first -= jian;
                now -= jian;
                if (t.first == 0) {
                    ans[++cnt] = t.second;
                }
                else q.push(t);
                if (now == 0) break;
            }
        }
        std::sort(ans + 1, ans + cnt + 1);
        printf("%d
    ", cnt);
        for (int i = 1; i <= cnt; ++i) {
            printf("%d ", ans[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    谍战系列
    干将莫邪
    漫话安全众测
    一句话安全
    jsp一句话
    struts2的DevMode模式
    morse code
    Nessus的安装/激活/更新
    WinPcap4.13无法安装解决方法
    安全用网,你应该知道的事
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/13599011.html
Copyright © 2011-2022 走看看