CF1203F1 Solution

题目链接

题解

对于\(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;
}
posted @ 2021-02-25 22:22  violet_holmes  阅读(68)  评论(0)    收藏  举报