HDU 4864 Task 多校第一场1004 multiset

本文探讨了如何高效地将任务分配给机器,确保每个任务仅由一台机器完成,并通过算法实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目链接: Click here


题目就是给出机器能运行的时间与难度,以及任务的时间及难度

Each machine can only complete a task one day. Each task can only be completed by one machine.

这句话一定要看到。。

然后看到数据量    xi(0<xi<1440),yi(0=<yi<=100)

= =这是突破口。。

之后只要对每个任务,找到难度大于它的最小的机器就好了。 从1440开始倒推,没用完的机器放到下一个时间点接着找。。


纯当练习STL吧。。

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

multiset<int> machine[1444];
vector<int> task[1444];
int n,m;
int main(){
	while(scanf("%d %d",&n,&m)!=EOF){
		for(int i = 1;i <= 1441;i++)task[i].clear(),machine[i].clear();
		int maxt = 0;
		for(int i = 1,u,v;i <= n;i++){
			scanf("%d %d",&u,&v);
			machine[u].insert(v);
			maxt = max(u,maxt);
		}
		for(int i = 1,u,v;i <= m;i++){
			scanf("%d %d",&u,&v);
			task[u].push_back(v);
		}
		for(int i = 1;i <= 1440;i++){
			sort(task[i].begin(), task[i].end());
		}
		int cnum = 0;
		long long ans = 0;
		
		for(int i = maxt;i > 0;i--){
			machine[i].insert(machine[i+1].begin(),machine[i+1].end());	
			machine[i+1].clear();
			if(!task[i].empty()){
				for(int j = task[i].size()-1; j >= 0;j--){
					int y = task[i][j];
					multiset<int>::iterator it = machine[i].lower_bound(y);
					if(it!=machine[i].end()){
						cnum++;
						ans += 500 * i + 2*y;
						machine[i].erase(it);
						
					}
				}
			}
		}

		cout << cnum <<" "<< ans << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值