题解:P10464 Task

由于时间对收入的影响远远大于等级对收入的影响,因此对于最优的选法一定是优先考虑时间的,因此得出贪心策略。

贪心策略:将机器和任务都按照时间和等级从大到小排序(时间优先,等级其次),然后从大到小枚举每个任务,对于每个任务,选择一个能满足当前任务所需时间的机器中等级最低的机器来完成当前任务。这样能保证最优的安排策略。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector<pair<int,int>>machine(n),task(m);
	for(auto&i:machine)cin>>i.first>>i.second;
	for(auto&i:task)cin>>i.first>>i.second;
	sort(machine.begin(),machine.end());
	sort(task.begin(),task.end());
	int j=n-1;
	vector<int>bucket(101,0);
	int num=0,money=0;
	for(int i=m-1; i>=0; --i) {
		for(j; j>=0; --j)
			if(machine[j].first>=task[i].first)
				bucket[machine[j].second]++;
			else break;
		for(int k=0; k<bucket.size(); ++k)
			if(k>=task[i].second&&bucket[k]) {
				num++;
				money+=500*task[i].first+2*task[i].second;
				bucket[k]--;
				break;
			}
	}
	cout<<num<<' '<<money<<endl;
}
posted @ 2024-09-16 11:33  cly312  阅读(11)  评论(0)    收藏  举报