小红打怪

题目重述

  • 怪物血量:第一只a,第二只b
  • 技能
    • 火球术:单体伤害x
    • 烈焰风暴:群体伤害y(每只怪物都受y伤害)
  • 目标:计算击杀两只怪物的最少技能使用次数

解题思路

暴力枚举法

由于数据范围很小(所有参数≤20),我们可以直接枚举所有可能的烈焰风暴使用次数k(0到20),然后计算对应的总技能次数:

  1. 使用k次烈焰风暴后:
    • 怪物剩余血量:max(0, a - k*y)max(0, b - k*y)
  2. 剩余血量用火球术补刀:
    • 计算ceil(剩余血量/x)(用整数除法技巧实现)
  3. 总次数 = k + 两个火球术次数
  4. 取所有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;
}