武器
描述
小明有一把武器,这把武器可以帮助他驱赶牧场周围的怪兽,但是武器有耐久限制,每击杀一个怪兽,都会降低耐久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内容作答:
运行结果如下:
可以为你提供一个相似的 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;
}