题解
对于\(b_i\ge 0\)可以提前处理,因为如果\(r\)一直增加仍无法完成,减少也一定不可行。这一部分按照\(a_i\)从小到大排序,因为较小的\(a_i\)容易满足。
对于\(b_i<0\),已知\(r\ge a_i\)我们希望\(r+b_i\ge a_{i+1}\),也就是\(r\ge max(a_i,a_{i+1}-b_i)\),将\(i,i+1\)交换后变为\(r\ge max(a_{i+1},a_i-b_{i+1})\)。利用贪心思想,我们希望需要的\(r\)尽量小,因此希望\(max(a_i,a_{i+1}-b_i)<max(a_{i+1},a_i-b_{i+1})\)。将该式化简:因为\(a_{i+1}<a_{i+1}-b_i\),所以右半部分一定取\(a_i-b_{i+1}\)。又因为\(a_i<a_i-b_{i+1}\),所以左半部分只有\(a_{i+1}-b_i\)需要考虑。可以将原不等式化简为\(a_{i+1}-b_i<a_i-b_{i+1}\),移项后得\(a_i+b_i>a_{i+1}+b_{i+1}\),依此式排序即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
struct node {int a,b;} c[110];
bool cmp(node x,node y)
{
if(x.b>0 && y.b>0) return x.a<y.a;
if(x.b<=0 && y.b<=0) return x.a+x.b>y.a+y.b;
return x.b>y.b;
}
int main()
{
int n,r;
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++) scanf("%d%d",&c[i].a,&c[i].b);
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(r<c[i].a || r<0) {printf("NO"); return 0;}
r+=c[i].b;
}
if(r>=0) printf("YES");
else printf("NO");
return 0;
}