cf题面html
看见这题以为贪心可作,那就贪吧。(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感受我如今比赛时候想贪心就是瞎猜,猜出一个结论就想办法hack,想不出hack就交上去,而后WA,而后自闭,很难摸到门道)spa
下面这些是个人作题和思考过程——.net
显然要先把能加rating和不掉rating的作了,并且要按照要求从低到高的顺序作,由于若是当前rating能知足要求高的,那也能知足要求低的,若是不知足要求高的,那就只能先去作要求低的那些工做以赚取足够的rating,总之先作要求低的赚rating就好。code
对于那些掉rating的工做怎么办呢……开始想着相似大于0的部分那样,因为这个阶段rating不断降低,因此先作要求高的。但很容易就把本身hack掉了(r=10;a1=9,b1=-5;a2=8,b2=-1
,显然先2后1能够完成所有任务,但按照先作要求高的任务的策略,先1后2,就不能完成任务),而后自闭了……htm
而后听到机房大佬提出了正确的策略——对于掉rating(\(b_i<0\))的工做,按照\(a_i+b_i\)递减的顺序作就好,没想出来怎么证实,先写了交一发,而后A了。赛后大佬在博客上的证实没太看懂,那就尝试用里面不等式的方式构造hack数据。blog
假设n=2
,总共两件工做,不妨假设其知足\(a_2+b_2<a_1+b_1\),并且应该先2后1,不能先1后2,那么通过思考,能够获得这么几个式子——\(r+b_2\geqslant a_1\)、\(r+b_1 < a_2\)、\(r+b_1+b_2 \geqslant 0\)。前两个式子看着挺像,加起来能够获得\(r+b_2+a_2> r+b_1+a_1\)即\(a_2+b_2>a_1+b_1\),诶,而后就和假设矛盾了,因而不能hack(第三个式子都没用到)。ip
回顾总结一下——对于知足先2后1不能先1后2的两件工做,它们就会知足\(a_2+b_2>a_1+b_1\)这个式子,因而就没了。get
从这里我学到了解贪心题的一种思路——解不等式。iframe
这里有另一篇题解,感性地解释了这个贪心的道理——博客
对于价值为正的项目,很明显咱们能够直接从小到大的把项目作掉,这样必定是最优的,对于负数来讲,咱们排差值,差值大的,说明损耗对于自身的损耗较小,这样才能保证本身还有能力作大项目,又能保证作完一个大项目后由于扣的太多而不能去作小项目
虽然仍是没太看懂……
顺便平常CSDN垃圾。查这场CF的题解的过程当中——
百度只查到了一篇这场CF的博文,来自CSDN,点进去并无看懂,以后各类改关键字,终于多了一点(是否是百度爬虫正好在这段时间里爬过)
因此CSDN收的VIP费用都拿去给百度竞价排名了吗艹
博客园良心啊。
#include<stdio.h> #include<algorithm> int n,r; struct P{ int need,change; bool operator < (const P & a) const{//这里貌似写复杂了 if(change<0&&a.change<0) { return change+need>a.change+a.need; } else if(change>=0&&a.change>=0) { if(need==a.need) return change>a.change; return need<a.need; } else return change>a.change; } }p[105]; int main() { scanf("%d%d",&n,&r); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].need,&p[i].change); std::sort(p+1,p+1+n); bool ok=1; for(int i=1;ok&&i<=n;i++) { if(r<p[i].need) ok=0; r+=p[i].change; if(r<0) ok=0; } puts(ok?"YES":"NO"); return 0; }