小明用武器驱赶怪兽,每击杀一个怪兽

武器
描述

小明有一把武器,这把武器可以帮助他驱赶牧场周围的怪兽,但是武器有耐久限制,每击杀一个怪兽,都会降低耐久x,但是在这之后小明可以从怪兽身上获取神秘因子,来修复y耐久,现在给出击杀每只怪兽会降低的耐久和可以修复的耐久,问请你帮助小明合理安排击杀顺序,能否在武器不损坏的情况下,击杀所有的怪兽,注意:在武器耐久<=0时,武器会马上损坏

day13-04.zip

输入
第一行表示数据组数T,

对于每组数,第一行两个整数n(n<=50000),m(m<=100000),分别表示怪兽的数量和武器的初始耐久,其后n行每行两个整数,表示杀每只怪兽会降低的耐久x和可以修复的耐久y

(0<=x,y<=100000)

输出
T行,可以输出Yes,不可以输出No

输入样例 1

1
5 10
90 90
5 80
60 70
100 50
30 40
输出样例 1

Yes

引用chatgpt内容作答:
运行结果如下:

img

可以为你提供一个相似的 C++ 代码示例来解决这个问题:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Monster {
    int decrease;
    int repair;

    bool operator<(const Monster& other) const {
        return repair - decrease > other.repair - other.decrease;
    }
};

int main() {
    int T;
    cin >> T;

    while (T--) {
        int n, m;
        cin >> n >> m;

        vector<Monster> monsters(n);
        for (int i = 0; i < n; ++i) {
            cin >> monsters[i].decrease >> monsters[i].repair;
        }

        sort(monsters.begin(), monsters.end());

        bool possible = true;
        long long currentDurability = m;

        for (int i = 0; i < n; ++i) {
            if (currentDurability <= 0) {
                possible = false;
                break;
            }
            currentDurability -= monsters[i].decrease;
            currentDurability = min(currentDurability + monsters[i].repair, (long long)m);
        }

        if (possible) {
            cout << "Yes" << endl;
        }
        else {
            cout << "No" << endl;
        }
    }

    return 0;
}

将输入样例按照 C++ 代码的格式输入,然后编译并运行代码,就可以得到相应的输出结果。

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

C++详细代码和注释


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

// 定义一个结构体,表示怪兽的信息
struct Monster {
  int x; // 杀死怪兽会降低的耐久
  int y; // 杀死怪兽可以修复的耐久
  Monster(int x, int y) : x(x), y(y) {} // 构造函数
};

// 定义一个比较函数,按照x-y的升序排序
bool cmp(Monster a, Monster b) {
  return a.x - a.y < b.x - b.y;
}

// 判断是否可以击杀所有的怪兽
bool can_kill_all(vector<Monster>& monsters, int m) {
  // 对怪兽按照x-y的升序排序,这样可以优先杀死损耗最小的怪兽
  sort(monsters.begin(), monsters.end(), cmp);
  // 遍历所有的怪兽
  for (auto monster : monsters) {
    // 如果武器耐久小于等于0,返回false
    if (m <= 0) return false;
    // 否则,减去杀死怪兽的耐久,加上修复的耐久
    m -= monster.x;
    m += monster.y;
  }
  // 如果武器耐久大于0,返回true
  return m > 0;
}

int main() {
  int T; // 数据组数
  cin >> T; // 输入数据组数
  while (T--) { // 对每组数据
    int n, m; // 怪兽数量和武器初始耐久
    cin >> n >> m; // 输入数量和耐久
    vector<Monster> monsters; // 存储怪兽信息的向量
    for (int i = 0; i < n; i++) { // 输入每只怪兽的信息
      int x, y; // 杀死怪兽会降低的耐久和可以修复的耐久
      cin >> x >> y; // 输入耐久和修复
      monsters.push_back(Monster(x, y)); // 创建一个怪兽对象,加入向量中
    }
    if (can_kill_all(monsters, m)) { // 调用函数判断是否可以击杀所有的怪兽
      cout << "Yes" << endl; // 如果可以,输出Yes
    } else {
      cout << "No" << endl; // 如果不可以,输出No
    }
  }
  return 0;
}