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;
}