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;
}
posted @ 2025-04-21 23:03  MrPython  阅读(4)  评论(0)    收藏  举报  来源