We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith job.
Now we have some workers. worker[i] is the ability of the ith 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) {
int total = 0;
for (int i = 0; i < worker.length; ++ i){
int curMax = 0;
for (int j = 0; j < difficulty.length; ++ j){
if (worker[i] >= difficulty[j]){
curMax = Math.max(curMax, profit[j]);
}
}
total += curMax;
}
return total;
}
}
改进方法,程序如下所示:
class Solution {
public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
int total = 0;
int len = profit.length;
Point[] p = new Point[len];
for (int i = 0; i < profit.length; ++ i){
p[i] = new Point(difficulty[i], profit[i]);
}
Arrays.sort(p, new Comparator<Point>(){
@Override
public int compare(Point a, Point b){
if (a.x != b.x){
return a.x - b.x;
}
return a.y - b.y;
}
});
Arrays.sort(worker);
for (int i = 0; i < worker.length; ++ i){
int j = 0, curMax = 0;
while (j < profit.length && worker[i] >= p[j].x){
curMax = Math.max(curMax, p[j].y);
++ j;
}
total += curMax;
}
return total;
}
}