Serval and Kaitenzushi Buffet
把问题倒过来做,就变成了:
初始时有 点 hp,每轮会恢复一点 hp。同时每轮使用一次技能,消耗 点 hp 来获得当前轮所对应的快乐值。你最多可以获得多少快乐值?
然后就是经典反悔贪心板子。每轮尝试使用技能,若 hp 不够就撤销掉所有用过的技能快乐值最少的那次。
#include <cstddef>
#include <functional>
#include <iostream>
#include <queue>
#include <ranges>
#include <utility>
#include <vector>
using namespace std;
istream& fin = cin;
ostream& fout = cout;
using ui = unsigned int;
using uli = unsigned long long int;
using li = long long int;
int main(void) {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
size_t T;
fin >> T;
while (T--) {
ui k;
size_t n;
fin >> n >> k;
vector<ui> d(n);
for (ui& i : d) fin >> i;
priority_queue<ui, vector<ui>, greater<>> q;
int hp = 0;
uli sum = 0;
for (auto i : d | ranges::views::reverse) {
hp += 1;
q.emplace(i);
sum += i;
hp -= k + 1;
while (hp < 0) {
sum -= q.top();
q.pop();
hp += k + 1;
}
}
fout << sum << '\n';
}
return 0;
}