HDU4864 貪心好題


  這道題的意識是給你N個機器和M個任務, 每個任務有兩個值花費時間x和難度y, 每個機器也有兩個值最大工作時間x1和最大工作難度y1, 機器可以勝任某個工作的條件是x1>=x && y1>=y,機器勝任一個工作可以拿到x*500+2*y的錢,現在問你怎么匹配才能使匹配數最大且錢數最多。 由於數據量過大我們考慮使用貪心來解決這道題, 由於x的權重遠大於y的權重,因此我們將工作按照x降序排列, x相同的時候按照y降序排列, 這樣就可以保證錢數最多,對於一個工作我們可以選擇的是所有x1>x的機器, 而在這些機器中我們選擇最小的y1, 為什么這樣選呢, 因為這樣選就可以保留比較大的y1使其去匹配后面的任務, 而x1則完全不用操心, 他肯定可以匹配后面的任務, 因為任務是按照x降序排列的, 代碼如下:

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int x, y;
    bool operator< (const node& r) const
    {
        if(x!=r.x) return x > r.x;
        else return y > r.y;
    }
}mach[100000+100], task[100000+100];
int N, M;    //machine task

int s[150];

int main()
{
    while(scanf("%d%d", &N, &M) == 2)
    {
        for(int i=0; i<N; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            mach[i] = (node){x, y};
        }
        for(int i=0; i<M; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            task[i] = (node){x, y};
        }
        sort(mach, mach+N);
        sort(task, task+M);
        int num = 0;  //匹配的數量
        long long money = 0;
        memset(s, 0, sizeof(s));
        int j = 0;
        for(int i=0; i<M; i++)
        {
            while(j<N && mach[j].x>=task[i].x)
            {
                s[mach[j].y]++;
                j++;
            }
            for(int k=task[i].y; k<=100; k++) if(s[k]>0)
            {
                num++;
                money += 500*task[i].x + 2*task[i].y;
                s[k]--;
                break;
            }
        }
        printf("%d %lld\n", num, money);
    }
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM