Codeforces Round #840 (Div. 2)-B. Incinerate

题目:
在这里插入图片描述
题意:
每个怪兽有一个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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值