Codeforces Round 635 (Div. 2) B. Kana and Dragon Quest game

发布时间 2023-10-16 17:24:14作者: zsxuan

你需要击败一只巨龙,他有 \(h\) 点血量,你可以使用以下两种攻击方式:

  • 黑洞:使巨龙的血量变为 \(\lfloor \frac{h}{2} \rfloor + 10\) 。可以使用 \(n\) 次。
  • 雷击:使巨龙的血量变为 \(h - 10\) 。可以使用 \(m\) 次/

当巨龙的血量 \(h \leq 0\) 时,你将他击败了。询问你是否可以将他击败。

显然黑洞的造成的伤害是一个降序函数,\(\lceil \frac{h}{2} \rceil - 10 \geq 10\) ,解得 \(h \geq 19\)

于是最优策略为一当 \(h \geq 19\) 并且 \(n \geq 1\) 时一直使用黑洞,\(n -= 1, x = \lfloor \frac{n}{2} \rfloor + 10\) ,时间复杂度为 \(\log_2 n\)

再计算剩余的血量是否可以通过雷击消灭,即 \(h \leq 10 * m\)

view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int x, n, m; std::cin >> x >> n >> m;
	while (x >= 19 && n >= 1) {
		n -= 1;
		x = x / 2 + 10;
	}
	std::cout << (x <= 10 * m ? "YES" : "NO") << '\n';
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}