2507 安排工作以达到最大收益

2507 安排工作以达到最大收益
有一些工作:difficulty[i] 表示第 [i] 个工作的难度,profit[i] 表示第 i 个工作的收益。

现在我们有一些工人。worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。

每一个工人都最多只能安排一个工作,但是一个工作可以完成多次。

举个例子,如果 3 个工人都尝试完成一份报酬为1的同样工作,那么总收益为 3。如果一个工人不能完成任何工作,他的收益为 0 。

我们能得到的最大收益是多少?

输入
第一行输入一个正整数n,表示工作份数;
第二、三行分别输入n个正整数,表示这n份工作的难度和收益;
第四行输入一个正整数m,表示工人数量;
第五行输入m个正整数,表示这m个工人的能力;
其中0≤n≤10000,0≤m≤10000,
0≤difficulty[i], profit[i], worker[i]≤100000
输出
输出一个数,表示最大的收益
输入样例
5
2 4 6 8 10
10 20 30 40 50
4
4 5 6 7
输出样例
100
题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=2507
解题思路
1.工作按难度从小到大进行排序
2.工人按能力从小到大排序
3.找到难度低于w[i]的利益最大的工作做 (贪心)
完整代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct WORK
{
	int d,p;
}work[100000];
int w[100000];
bool cmp(WORK x,WORK y)
{
  if (x.d==y.d) return x.p<y.p;
  return x.d<y.d;
}
int main()
{
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		cin >> work[i].d;
	}
	for(int i = 1 ;i <= n;i++)
	{
		cin >> work[i].p;
	}
	sort(work + 1,work + n + 1,cmp);//工作按难度从小到大进行排序 
	cin >> m;
	for(int i = 1;i <= m;i++)
	{
		cin >> w[i];
	}
	sort(w + 1,w + m + 1);//工人按能力从小到大排序
	int ans = 0,sum = 0;
	for(int i = 1;i <= m;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			if(work[j].d <= w[i])//找到难度低于w[i]的利益最大的工作做 
			ans = max(ans,work[j].p);//贪心 
		}
		sum += ans;
	}
	cout << sum;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值