题解 | #消灭怪物#

消灭怪物

https://www.nowcoder.com/practice/d88ef50f8dab4850be8cd4b95514bbbd

#include <climits>
#include <iostream>
#include <vector>
using namespace std;

int f(std::vector<std::vector<int>> &nums, std::vector<bool> &used, int blood)
{
    // num 已经使用的技能数, blood 剩余血量
    if (blood <= 0) {
        return 0;
    }  

    int min_num = INT_MAX;
    for (int i = 0; i < nums.size(); i++) {
        if (used[i]) {continue;} // 技能已经使用了

        used[i] = true;
        int hurt;
        if (blood <= nums[i][1]) {
            hurt = nums[i][0]*2;
        } else {
            hurt = nums[i][0];
        }
        int val = f(nums, used, blood - hurt);
        min_num = std::min(min_num, val);
        used[i] = false;
    }
    return min_num == INT_MAX? INT_MAX : min_num + 1;
}

int main() {
    int T;
    std::cin >> T;
    int m;  // 血量
    int n;  // 技能数
    int A;  // 技能伤害
    int x;  // 低于x血量, 技能伤害翻倍
    while (T--) {
        std::cin >> n >> m;
        std::vector<std::vector<int>> nums(n, std::vector<int>(2, 0));
        std::vector<bool> used(n, false);   // 技能点是否使用了
        for (int i = 0; i < n; i++) {
            std::cin >> A >> x;
            nums[i][0] = A;
            nums[i][1] = x;
        }
        int res = f(nums, used, m);
        if (res == INT_MAX) {res = -1;}
        std::cout << res << std::endl;
    }
}
// 64 位输出请用 printf("%lld")

n < 10 说明支持时间复杂度 n!的算法, 直接递归

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务