這道題的意識是給你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; }