D - シューティング / Shooting Editorial by nok0 Editorial for printing


アイテム \(1,2\) の使う順番について考えます。

アイテム \(2\) は、敵の体力が大きいほど敵の体力を大きく削れてることから、先に使う方がよいです。

よってアイテム \(2\) を使う -> アイテム \(1\) を使う が最適であることが分かります。

また、アイテム \(2\) を使う回数について考えると、敵の体力が毎回半分以下になるので、\(\mathrm{O}(\log N)\) 回使えば敵の体力を \(0\) に出来ることが分かります。

このことから、アイテム \(2\) を使う回数を全探索することでこの問題を解くことができます。

実装例(C++):

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {
  ll h, a, b, c, d;
  cin >> h >> a >> b >> c >> d;
  ll tmp = 0;
  ll res = (h + a - 1) / a * b;
  for (int i = 0; i < 30; i++) {
    h -= c;
    if (h >= 0) h -= h / 2;
    tmp += d;
    if (h <= 0) {
      res = min(res, tmp);
      break;
    }
    res = min(res, tmp + (h + a - 1) / a * b);
  }
  cout << res << endl;
}

posted:
last update: