小红打怪
题目重述
- 怪物血量:第一只a,第二只b
- 技能:
- 火球术:单体伤害x
- 烈焰风暴:群体伤害y(每只怪物都受y伤害)
- 目标:计算击杀两只怪物的最少技能使用次数
解题思路
暴力枚举法
由于数据范围很小(所有参数≤20),我们可以直接枚举所有可能的烈焰风暴使用次数k(0到20),然后计算对应的总技能次数:
- 使用k次烈焰风暴后:
- 怪物剩余血量:
max(0, a - k*y)
和max(0, b - k*y)
- 怪物剩余血量:
- 剩余血量用火球术补刀:
- 计算
ceil(剩余血量/x)
(用整数除法技巧实现)
- 计算
- 总次数 = k + 两个火球术次数
- 取所有k情况中的最小值
代码实现
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int a, b, x, y;
cin >> a >> b >> x >> y;
int min_skills = INT_MAX;
// 枚举烈焰风暴使用次数k
for (int k = 0; k <= 20; ++k) {
int remaining_a = max(0, a - k * y);
int remaining_b = max(0, b - k * y);
// 计算需要的火球术次数(向上取整)
int skills = k + (remaining_a + x - 1) / x + (remaining_b + x - 1) / x;
min_skills = min(min_skills, skills);
}
cout << min_skills << endl;
return 0;
}