「题解」洛谷 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\n", cnt);
    for (int i = 1; i <= cnt; ++i) {
        printf("%d ", ans[i]);
    }
    return 0;
}
posted @ 2020-09-01 22:09  yu__xuan  阅读(94)  评论(0编辑  收藏  举报