「土」巨石滚滚

https://ac.nowcoder.com/acm/problem/53681

intial :

a 从小到大,b 从大到小

finally

b - a分为连部分

前部分 : 正的 a 从小到大,

后部分 : 负的  b 从大到小

???

最后收益是正的,也就是说m是一直增加的,自然要从消耗小的开始

最后收益是负的,m是一直减少的 ,要补充最多的,

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+5;

int t;
int n,m;
struct node{
    int a,b,c;
}p[maxn];

bool cmp(node a,node b){
    if(a.c >= 0 && b.c >= 0) return a.a < b.a;
    else if(a.c < 0 && b.c < 0) return a.b > b.b;
    return a.c > b.c;
}

signed main(){
    ios::sync_with_stdio(0);
    cin >> t;
    while(t--){
       cin >> n >> m;
        for(int i=1;i<=n;++i){
            cin >> p[i].a >> p[i].b;
            p[i].c = p[i].b-p[i].a;
        }
        sort(p+1,p+n+1,cmp);
        for(int i=1;i<=n;++i){
            m -= p[i].a;
            if(m < 0) break;
            m += p[i].b;
        }
        if(m < 0) cout << "No" << endl;
        else cout << "Yes" << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xcfxcf/p/12955966.html