你需要击败一只巨龙,他有 \(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;
}