第一天早上你没有钱,每天晚上得到 X 元。在第 i 天里,你可以花费 Ci 元买一个菠萝派。在任何时刻你都不能欠钱,问这 N 天最多能吃多少菠萝派。
先不考虑钱,无脑买。如果钱变成负数,就从之前买过的挑一个最贵的不买,即延迟决策。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
i64 sum = 0; std::priority_queue<int> h; for (int i = 0; i < N; i++) { int c; std::cin >> c; h.push(c); sum -= c; if (sum < 0) { sum += h.top(); h.pop(); } sum += X; } std::cout << h.size() << "\n";
在第 i 天里,菠萝派的价格调整为 Ci。你每天要么买一个菠萝派,要么卖一个,要么什么都不干。希望在第 N 天结束时不持有菠萝派,并最大化盈利。
1 2 3 4 5 6 7 8 9 10 11 12 13
i64 ans = 0; std::priority_queue<int, std::vector<int>, std::greater<>> h; for (int i = 0; i < N; i++) { int x; std::cin >> x; if (!q.empty() && q.top() < x) { ans += x - q.top(); q.pop(); q.push(x); } q.push(x); } std::cout << ans << "\n";