本题是一个贪心问题,如果进行任务和机器的匹配是我们要考虑的问题。首先如果按照任务的要求去找机器的话,那么任务可以先定时间,去机器里面找时间上符合要求的机器,然后肯定是要选择满足难度级别的最小的那一个,这样可以为后面的任务腾出最大的空间。但题目要求数量和利润都达到最大,但从利润的计算公式上看,时间的占比是难度级别赶不上的。所以直接按照难度级别尽量的去做任务就可以了。本题在寻找满足难度级别的难度级别最小的机器的时候要使用二分查找,或者使用现成的lower_bound,否则双重循环会超时。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 100000+10;
struct Node {
int x, y;
}robot[maxn], task[maxn];
int N, M;
multiset<int> ms;
bool comp(Node n1, Node n2) {
if (n1.x==n2.x) return n1.y>n2.y;
return n1.x>n2.x;
}
int main() {
cin>>N>>M;
for (int i=0;i<N;i++) {
scanf("%d %d", &robot[i].x, &robot[i].y);
}
for (int i=0;i<M;i++) {
scanf("%d %d", &task[i].x, &task[i].y);
}
sort(robot, robot+N, comp);
sort(task, task+M, comp);
ll j = 0;
ll cnt=0, ans = 0;
for (int i=0;i<M;i++) {
for (;j<N&&robot[j].x>=task[i].x;j++) {
ms.insert(robot[j].y);
}
multiset<int>::iterator pos = ms.lower_bound(task[i].y);
if (pos!=ms.end()) {
cnt++;
ans += 500*task[i].x+2*task[i].y;
ms.erase(pos);
}
}
cout<<cnt<<" "<<ans;
return 0;
}

京公网安备 11010502036488号