Codeforces 1203F1 Complete the Projects (easy version)

cf題面html

  • Time limit
    2000 ms
  • Memory limit
    262144 kB

解題思路

看見這題以爲貪心可作,那就貪吧。(昨天真是貪心的一天,凌晨才被這兩道貪心題虐,下午多校又來,感受我如今比賽時候想貪心就是瞎猜,猜出一個結論就想辦法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上的博文,CSDN下方的類似推薦,推薦出來的東西餘弦值之差怕是差180度哦,毛線關係都沒有。
  • 打開一篇博客園上的博文,博客園下方的相關博文一欄推薦的5篇博客,4篇是這場CF的題解,另外一篇是以前某次的CF題解

因此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;
}
相關文章
相關標籤/搜索