luogu P2619 奶牛工資

原題位置: https://www.luogu.org/problem/show?pid=2619

這道題是個貪心,怎麼說是貪心呢,就是先選大的,後考慮小的;

千萬不要把上句話的意思理解歪了,一開始我就理解歪了,然後華麗麗地TLE了;

其實就是for,然後如果當前這個值可以被選,就選到不能再選這個值爲止;

還有一個小技巧,就是我們定義一個值,等於c,然後用這個值減,知道小於等於0,這樣子比一直加到c好處理多了;

一開始我是加到c,太難處理了;

然後就是while和for就好了;


cpp

#include<iostream>
#include<cstdio>
#include<algorithm>
#define II int
#define B bool
#define R register
#define I 123456
using namespace std;


struct node {
    II buy,nu;
}aa[I];

II n,c,ans;

B maP(node a1,node a2) { return a1.buy>a2.buy; }


int main()
{
    freopen("1.in","r",stdin);

    scanf("%d%d",&n,&c);
    for(R II i=1;i<=n;i++)
    {
        scanf("%d%d",&aa[i].buy,&aa[i].nu);
    } 

    sort(aa+1,aa+n+1,maP);

    R II now=1, en=n;
    while (aa[now].buy>=c) {
        ans+=aa[now].nu;
        now++;
    }

    while (1) {
        R II ka=c;
        // 小技巧; 
        for(R II i=now;i<=n;i++)
        // 所謂的從大到小貪心就是這個枚舉順序了; 
        {
            while (ka>=aa[i].buy&&aa[i].nu&&ka>0) {
                ka-=aa[i].buy;
                aa[i].nu--;
            }
            // 一直減到不能再減爲止,然後換下一個值;
        } 
        if(ka>0) for(R II i=n;i>=now;i--) {
            if(aa[i].buy>=ka&&aa[i].nu) {
                aa[i].nu--;
                ka-=aa[i].buy;
                break ;
            }
        }
        // 找一個大於剩餘值且最小的, 補全; 
        if(ka>0) break ;
        // 如果還不行,證明剩下的組不成c了,結束; 
        ans++;
    }

    printf("%d\n",ans);
    exit(0);
}

by pretend_fal

END;

發佈了33 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章