「土」巨石滚滚
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; }