题目
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;
}