We have jobs: difficulty[i]
is the difficulty of the i
th job, and profit[i]
is the profit of the i
th job.
Now we have some workers. worker[i]
is the ability of the i
th worker, which means that this worker can only complete a job with difficulty at most worker[i]
.
Every worker can be assigned at most one job, but one job can be completed multiple times.
For example, if 3 people attempt the same job that pays $1, then the total profit will be $3. If a worker cannot complete any job, his profit is $0.
What is the most profit we can make?
Example 1:
Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7] Output: 100 Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately.
Notes:
1 <= difficulty.length = profit.length <= 10000
1 <= worker.length <= 10000
difficulty[i], profit[i], worker[i]
are in range[1, 10^5]
题目理解:
给定一系列工作和工人,工作有两个属性,一个是难度,一个是收益,工人有一个属性值能力,工人只能完成难度值不高于自己能力的工作,完成了之后会得到相应的收益。每一个工作可以被做多次,在给定工作和工人的情况下,问最大的收益是多少
解题思路:
计算出每一个工作难度下,能够得到的最大收益是多少。然后遍历所有的工人,找到他能够胜任的工作的最高难度,然后找到相应的收益,最后相加即可。
代码如下:
class Solution {
public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
int len = difficulty.length;
int min = difficulty[0];
for(int i = 0; i < len; i++) {
min = Math.min(min, difficulty[i]);
int key = difficulty[i];
int value = Math.max(profit[i], map.getOrDefault(key, 0));
map.put(key, value);
}
for(int key : map.keySet()) {
if(key == min)
continue;
int value = Math.max(map.get(key), map.getOrDefault(map.lowerKey(key), 0));
map.put(key, value);
}
int res = 0;
for(int cur : worker) {
int pos = -1;
if(map.floorKey(cur) != null)
pos = map.floorKey(cur);
res += map.getOrDefault(pos, 0);
}
return res;
}
}