我的思路是先对任务排序(按工作时长优先,降序排列),对机器排序(按机器等级优先,升序排列)。
然后对于每个任务(贪心,先选工作时间最长的任务),把时间满足要求且等级满足要求的机器全挑出来,再从中选出等级最低的那一台。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
struct node {
int time, grade;
bool isUsed = false;
}machine[maxn], task[maxn];
int cmp_task(node a, node b) {
if (a.time == b.time)
{
return a.grade > b.grade;
}
return a.time > b.time;
}
int cmp_machine(node a, node b) {
if (a.grade == b.grade)
{
return a.time < b.time;
}
return a.grade < b.grade;
}
int main() {
int numMachine, numTask;
cin >> numMachine >> numTask;
for (int i = 0; i < numMachine; i++) {
cin >> machine[i].time >> machine[i].grade;
}
for (int i = 0; i < numTask; i++) {
cin >> task[i].time >> task[i].grade;
}
sort(task, task + numTask, cmp_task);
sort(machine, machine + numMachine, cmp_machine);
int num = 0;
long long ans = 0;
for (int i = 0; i < numTask; i++)
{
for (int j = 0; j < numMachine; j++)
{
if (machine[j].time >= task[i].time && machine[j].isUsed == false && machine[j].grade >= task[i].grade)//把时间满足要求且等级满足要求的机器全挑出来,再选出其中等级最低的那一台
{
machine[j].isUsed = true;
num++;
ans = ans + 200 * task[i].time + 3 * task[i].grade;
break;
}
}
}
cout << num << " " << ans << endl;
system("pause");
return 0;
}