# 826. Most Profit Assigning Work

**<font color=red>难度: Medium</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/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 $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]
```

## 解题方案

> 思路 1
******- 时间复杂度: O(max(PlgP, WlgW))******- 空间复杂度: O(P)******


我们要做的就是对于每一个worker，我们都找到他能够胜任的所有工作，并且在其中选一个profit最大的

beats 86.67%

```python
class Solution:
    def maxProfitAssignment(self, difficulty, profit, worker):
        """
        :type difficulty: List[int]
        :type profit: List[int]
        :type worker: List[int]
        :rtype: int
        """
        difficulty, profit = zip(*sorted(zip(difficulty, profit)))
        difficulty, profit = list(difficulty), list(profit)
        
        maxx = -float('inf')
        for i in range(len(profit)):
            if maxx < profit[i]:
                maxx = profit[i]
            else:
                profit[i] = maxx
                
        res = 0
        for w in worker:
            i = bisect.bisect_right(difficulty, w)
            if i != 0: 
                res += profit[i-1]
        return res
```


> 思路 2
******- 时间复杂度: O(max(PlgP, WlgW))******- 空间复杂度: O(P)******

另外一种写法，beats 93.33%

```python
class Solution:
    def maxProfitAssignment(self, difficulty, profit, worker):
        """
        :type difficulty: List[int]
        :type profit: List[int]
        :type worker: List[int]
        :rtype: int
        """
        jobs = list(zip(difficulty, profit))
        jobs.sort()
        res = i = best = 0
        for ability in sorted(worker):
            while i < len(jobs) and ability >= jobs[i][0]:
                best = max(best, jobs[i][1])
                i += 1
            res += best
        return res
```
















































