description
![这里写图片描述](https://img-blog.csdn.net/20170906221337864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2h1bmtpdGxhdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
solution
考虑贡献为正的,显然花费a最少先做,考虑贡献为负的,可以将ab调转过来,那显然花费最少的先做,也就是b最小的先做。
code
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LF double
#define LL long long
#define ULL unsigned int
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define fr(i,j) for(int i=begin[j];i;i=next[i])
using namespace std;
int const mn=1e5+2;
int t,n;
LL v;
struct rec{
int p,w;
};
rec a[mn];
bool cmp(rec x,rec y){
return ((x.w-x.p>=0)&&(y.w-y.p>=0)&&(x.p<y.p))
||((x.w-x.p>=0)&&(y.w-y.p<0))
||((x.w-x.p<0)&&(y.w-y.p<0)&&(x.w>y.w));
}
int main(){
freopen("backpack.in","r",stdin);
freopen("backpack.out","w",stdout);
scanf("%d",&t);
fo(cas,1,t){
scanf("%d%lld",&n,&v);
fo(i,1,n)scanf("%d%d",&a[i].p,&a[i].w);
sort(a+1,a+n+1,cmp);
fo(i,1,n)if(a[i].p<=v)v+=a[i].w-a[i].p;
else{v=-1;break;}
if(v!=-1)printf("Yes\n");
else printf("No\n");
}
return 0;
}