目录
输入输入的第一行包含一个整数t(1≤t≤100)--测试案例的数量。测试用例的描述如下。
输出 对于每个测试案例,打印答案--如果Genos可以杀死所有的怪物,则打印 "YES"(不带引号),否则打印 "NO"。
题目
为了消灭人类,怪物协会派了n个怪物到地球表面。第i个怪物的健康状况是hi,力量是pi。
通过他最后的攻击手段--真气螺旋焚烧炮,吉诺斯可以对所有活着的怪物造成k的伤害。换句话说,吉诺斯可以通过一次攻击使所有怪物的健康状况减少k(如果k>0)。
然而,在吉诺斯的每次攻击之后,怪物们都会前进。在它们的共同努力下,它们将Genos的攻击伤害减少到†最弱的怪物‡活的力量。换句话说,每次攻击后,所有当前活着的怪物中的最小π会从k的值中减去。
†最弱的怪物是力量最小的怪物。
‡如果一个怪物的健康状况严格大于0,它就是活着的。
基诺斯是否能成功杀死所有的怪物?
输入
输入的第一行包含一个整数t(1≤t≤100)--测试案例的数量。测试用例的描述如下。
每个测试案例的第一行包含两个整数,n和k(1≤n,k≤105)--怪物的数量和Genos的初始攻击伤害。然后是两行,每行包含n个整数,描述数组h和p(1≤hi,pi≤109)。
保证所有测试案例的n之和不超过2⋅105。
输出
对于每个测试案例,打印答案--如果Genos可以杀死所有的怪物,则打印 "YES"(不带引号),否则打印 "NO"。
样例输入
3
6 7
18 5 13 9 10 1
2 7 2 1 2 6
3 4
5 5 5
4 4 4
3 2
2 1 3
1 1 1
样例输出
YES
NO
YES
对于这道题呢,题目的意思很简单,就是看能否去杀死全部怪物,由于怪物有两个值,所以这里推荐结构体,然后进行排序。最后就是对每一只怪物进行遍历即可。
友情提示:不要每次从0开始遍历,否则会t的哦
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
struct llk {
int a,b;
};
bool cmp(llk x,llk y){
return x.b<y.b;
}
int main() {
llk q[N];
int t;
cin >> t;
int n, m;
while (t--) {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &q[i].a);
}
for (int i = 0; i < n; i++) {
scanf("%d", &q[i].b);
}
sort(q,q+n,cmp);
long long sum=m;
for(int i=0;i<n;i++){
q[i].a-=sum;
while(q[i].a>0&&m>0){
m-=q[i].b;
q[i].a-=m;
sum+=m;
}
if(m<=0){
break;
}
}
if (q[n-1].a<=0)cout << "YES" << endl;
else cout << "NO" << endl;
}
}