题目:
题意:
每个怪兽有一个hi和一个pi
给定一个初始的伤害k,每一轮进攻会对所有活着的怪兽造成k伤害
随后,k会减少 当前活着(也即hi > 0)的怪兽中 pi的最小值
问能否将所有的怪兽消灭完毕?
思路: 直接求在k为0之前,造成的累积伤害最大值damage,如果damage大于所有怪兽的hi,说明可以消灭所有的怪兽;否则不能。
把怪兽按照pi排序,因为当遇到一个未消灭的怪兽时,k需要减去这个怪兽的pi值;具体思路见代码
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define sf(x) scanf("%d", &x);
#define Pu puts("");
const int N = 1e5 + 10;
struct E {
int h, p;
} e[N];
int n, m, k;
bool cmp(E a, E b) {
if (a.p == b.p)
return a.h < b.h;
return a.p < b.p;
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
sf(e[i].h);
}
for (int i = 1; i <= n; i++) {
sf(e[i].p);
}
sort(e + 1, e + n + 1, cmp);
int damage = k;
int id = 1;
while (id <= n && k > 0) {
while (damage >= e[id].h && id <= n)
id++;
if (id > n)
break;
k -= e[id].p;
if (k > 0)
damage += k;
}
int f = 1;
for (int i = 1; i <= n; i++) {
if (damage < e[i].h) {
f = 0;
break;
}
}
if (f == 1)
puts("YES");
else
puts("NO");
}
}