解题思路

简单思维+快速排序
现在摆在我们面前的分别有以下几种选择:

1、如果总能量增大,那么我们就把基础伤害小的放到前面来,如果一来碰大的,可能直接爆炸。多加点底数说不定就过去了。

2、如果总能量减少,首先他应该在能量增大后面,那么对于减少的情况需不需要排序呢,需要,给定2个,看下面的图就行了,得到回复越大的越先

假设最终回复之后大于0,假设先1优于先2,那么先1最小的代价就要比你先2小,代价怎么求,就是不散架的最小值即可。因为你首先要活下来才能回血。

对于每两次操作之间,只要保证最小值尽可能小就是最优解。


)好像上面有问题,这个题目不能转化为最多杀怪问题!!记作不能。
对于这个题目要么活下来,要么活不下来,如果你最后可以活下来,那么伤害都要吃满,回复应该先拉满,在最后一步活下来可能才最大!

图片说明

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int read() {
    int s = 0, w = 1; char ch = getchar();
    while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}

const int N = 5e5 + 5;
struct Node {
    int x, y, z;
}p[N];

bool cmp1(const Node a, const Node b) {
    return a.z > b.z;
}

bool cmp2(const Node a, const Node b) {
    return a.x < b.x;
}

bool cmp3(const Node a, const Node b) {
    return a.y > b.y;
}

int main() {
    int T = read();
    while (T--) {
        int n = read();
        ll m = read();
        int cnt = 0;
        for (int i = 1; i <= n; ++i) {
            p[i].x = read();
            p[i].y = read();
            p[i].z = p[i].y - p[i].x;
            if (p[i].z > 0)    ++cnt;
        }
        stable_sort(p + 1, p + 1 + n, cmp1);
        stable_sort(p + 1, p + 1 + cnt, cmp2);
        stable_sort(p + 1 + cnt, p + 1 + n, cmp3);
        bool flag = false;
        for (int i = 1; i <= n; ++i) {
            if (m < p[i].x) {
                flag = true;
                break;
            }
            m += p[i].z;
        }
        if (flag)    puts("No");
        else    puts("Yes");
    }

    return 0;
}