AtCoder Beginner Contest 153
打怪兽专场:https://atcoder.jp/contests/abc153
下文中出现的怪兽被杀死指生命值降至 $0$ 或以下。
A - Serval vs Monster
题意
怪兽生命值为 $h$,每次攻击伤害为 $a$,问怪兽被杀死至少需要攻击多少次。
题解
即计算 $\lceil \frac{h}{a} \rceil$ 。
代码
#include <bits/stdc++.h> using namespace std; int main() { int h, a; cin >> h >> a; cout << (h + a - 1) / a; }
B - Common Raccoon vs Monster
题意
怪兽生命值为 $h$,给出接下来 $n$ 次攻击的伤害,判断怪兽能否被杀死。
题解
求和判断即可。
代码
#include <bits/stdc++.h> using namespace std; int main() { int h, n; cin >> h >> n; int sum = 0; for (int i = 0; i < n; i++) { int x; cin >> x; sum += x; } cout << (sum >= h ? "Yes" : "No"); }
C - Fennec vs Monster
题意
给出 $n$ 只怪兽的生命值,每次攻击伤害为 $1$,可以直接杀死最多 $k$ 只怪兽,问最少要攻击多少次才能杀死所有怪兽。
题解
贪心,先直接杀死生命值最多的 $k$ 只怪兽,答案即余下怪兽生命值的总和。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; int h[n] = {}; for (int i = 0; i < n; i++) cin >> h[i]; sort(h, h + n); cout << accumulate(h, h + max(0, n - k), 0LL); }
D - Caracal vs Monster
题意
初始时有一只怪兽,生命值为 $h$,可以攻击一只怪兽使其分裂为两只生命值为 $\lfloor \frac{h}{2} \rfloor$ 的新怪兽,问至少要攻击多少次才能杀死所有怪兽。
题解
对从 $h$ 至 $0$ 每个途径生命值怪兽的数量求和。
代码
#include <bits/stdc++.h> using ll = long long; using namespace std; int main() { ll h; cin >> h; ll cnt = 0, num = 1; while (h != 0) { cnt += num; num *= 2, h /= 2; } cout << cnt << "\n"; }
E - Crested Ibis vs Monster
题意
怪兽生命值为 $h$,有 $n$ 种攻击方式,伤害为 $val_i$,花费为 $cost_i$,同一种攻击方式可重复使用,问杀死怪兽所需的最少花费。
题解
$dp_i$ 为伤害为 $i$ 的最少花费。
代码
#include <bits/stdc++.h> using namespace std; const int N = 1e5; const int INF = 1e9; const int MAXN = 1e4; int val[N], cost[N]; int dp[N]; int main() { int h, n; cin >> h >> n; for (int i = 0; i < n; i++) cin >> val[i] >> cost[i]; fill(dp, dp + N, INF); dp[0] = 0; for (int i = 0; i < n; i++) for (int j = val[i]; j <= MAXN; j++) dp[j] = min(dp[j], dp[j - val[i]] + cost[i]); cout << *min_element(dp + h, dp + N); }

浙公网安备 33010602011771号