chapter-four/0800~0899/0826.Most-Profit-Assigning-Work
826. Most Profit Assigning Work
题目
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 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.
Note:
- 1 <= difficulty.length = profit.length <= 10000
- 1 <= worker.length <= 10000
- difficulty[i], profit[i], worker[i] are in range [1, 10^5]
题目大意
这道题考察的是滑动窗口的问题,也是排序相关的问题。
给出一组任务,每个任务都有一定的难度,每个任务也都有完成以后对应的收益(完成难的任务不一定收益最高)。有一批工人,每个人能处理的任务难度不同。要求输出这批工人完成任务以后的最大收益。
解题思路
先将任务按照难度排序,工人也按照能处理任务难度的能力排序。用一个数组记录下,每个 i 下标,当前能达到的最大收益。计算这个收益只需要从下标为 1 开始,依次比较自己和前一个的收益即可(因为排过序,难度是依次递增的)。有了这个难度依次递增,并且记录了最大收益的数组以后,就可以计算最终结果了。遍历一遍工人数组,如果工人的能力大于任务的难度,就加上这个最大收益。遍历完工人数组,最终结果就是最大收益。
代码
package leetcode import ( "fmt" "sort" ) // Task define type Task struct { Difficulty int Profit int } // Tasks define type Tasks []Task // Len define func (p Tasks) Len() int { return len(p) } // Swap define func (p Tasks) Swap(i, j int) { p[i], p[j] = p[j], p[i] } // SortByDiff define type SortByDiff struct{ Tasks } // Less define func (p SortByDiff) Less(i, j int) bool { return p.Tasks[i].Difficulty < p.Tasks[j].Difficulty } func maxProfitAssignment(difficulty []int, profit []int, worker []int) int { if len(difficulty) == 0 || len(profit) == 0 || len(worker) == 0 { return 0 } tasks, res, index := []Task{}, 0, 0 for i := 0; i < len(difficulty); i++ { tasks = append(tasks, Task{Difficulty: difficulty[i], Profit: profit[i]}) } sort.Sort(SortByDiff{tasks}) sort.Ints(worker) for i := 1; i < len(tasks); i++ { tasks[i].Profit = max(tasks[i].Profit, tasks[i-1].Profit) } fmt.Printf("tasks = %v worker = %v\n", tasks, worker) for _, w := range worker { for index < len(difficulty) && w >= tasks[index].Difficulty { index++ } fmt.Printf("tasks【index】 = %v\n", tasks[index]) if index > 0 { res += tasks[index-1].Profit } } return res }