
今天公司有M项任务要完成。第iii个任务需要xi分钟才能完成。同时,这个任务有一个难度级别yi。等级低于此任务的机器不能完成此任务。如果公司完成这项任务,他们将得到(500∗xi+2∗yi)元报酬。
公司有N台机器。每台机器有一个最大的工作时间和等级。如果完成该任务的时间超过机器的最大工作时间,则机器不能完成该任务。每台机器一天只能完成一项任务。每一项任务只能由一台机器完成。
公司希望最大限度地增加他们今天能完成的任务的数量。如果有多种解决方案,他们希望最大化报酬。
题目
- 原题地址:任务
- 题目编号:NC235294
- 题目类型:set、贪心
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 有 n 个任务,m 台机器,每个任务和每台机器都有 x 和 y,分别代表完成所需的时间/工作的最大时间和难度等级
- 一台机器只能执行一个任务,并且满足工作的最大时间大于等于完成所需的时间,机器的等级要大于等于任务的等级
- 对于第 i 个任务有 xi 和 yi,完成该任务就可以获得 500∗xi+2∗yi 的报酬
- 求最多能完成的任务数量以及最大的报酬
2.题目分析
- 先对任务和机器排序,时间大的在前面,时间相同的等级高的在前面
- 对于每个任务,先选出时间大于该任务的机器,再选择选出的机器中等级不低于该任务的最低等级的机器进行匹配,随后从集合中去掉该机器
- 由于已经排序(时间大的在前面),所以可以保证前面的任务选出的机器的时间一定大于后面的机器,所以集合中只需要存储等级即可
- 需要注意这里使用的是
multiset
,它可以保证元素有序并且元素可以重复
- 如果用
set
的话,匹配完一个机器会去掉集合中该机器对应的等级,由于同一等级的机器可能不止一个,并且我们只存储等级,所以每次匹配后去掉的是选中的机器中所有等级为匹配等级的机器,这显然是不合理的
3.题目代码
#include <bits/stdc++.h>
using namespace std;
typedef struct ma {
int x, y;
bool operator< (const ma &p) const { return x==p.x?y>p.y:x>p.x;}
} ma;
int main() {
int n, m;
cin >> n >> m;
ma a[n], b[m];
for(int i=0;i<n;i++) cin >> a[i].x >> a[i].y;
for(int i=0;i<m;i++) cin >> b[i].x >> b[i].y;
sort(a, a+n);
sort(b, b+m);
multiset<int> ms;
long long cnt = 0, ans = 0;
for(int i=0,j=0;i<m;i++) {
while(j<n&&b[i].x<=a[j].x) ms.insert(a[j++].y);
auto it = ms.lower_bound(b[i].y);
if(it!=ms.end()) cnt++, ans += 500*b[i].x + 2*b[i].y, ms.erase(it);
}
cout << cnt << ' ' << ans << endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】