zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Web开发之编码与解码、签名、加密与解密
    深入解析单例线程安全问题
    PL/SQL&存储过程||存储函数&触发器
    oracle
    子查询中的NULL问题
    springmvc适配器的应用
    MySQL
    Django rest framework(5)----解析器
    Django rest framework(4)----版本
    1. Django每日一码 之原生View源码
  • 原文地址:https://www.cnblogs.com/violetholmes/p/14449702.html
Copyright © 2011-2022 走看看