Welcome to Subscribe On Youtube
826. Most Profit Assigning Work
Description
You have n jobs and m workers. You are given three arrays: difficulty, profit, and worker where:
difficulty[i]andprofit[i]are the difficulty and the profit of theithjob, andworker[j]is the ability ofjthworker (i.e., thejthworker can only complete a job with difficulty at mostworker[j]).
Every worker can be assigned at most one job, but one job can be completed multiple times.
- For example, if three workers attempt the same job that pays
$1, then the total profit will be$3. If a worker cannot complete any job, their profit is$0.
Return the maximum profit we can achieve after assigning the workers to the jobs.
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 a profit of [20,20,30,30] separately.
Example 2:
Input: difficulty = [85,47,57], profit = [24,66,99], worker = [40,25,25] Output: 0
Constraints:
n == difficulty.lengthn == profit.lengthm == worker.length1 <= n, m <= 1041 <= difficulty[i], profit[i], worker[i] <= 105
Solutions
-
class Solution { public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int n = difficulty.length; List<int[]> job = new ArrayList<>(); for (int i = 0; i < n; ++i) { job.add(new int[] {difficulty[i], profit[i]}); } job.sort(Comparator.comparing(a -> a[0])); Arrays.sort(worker); int res = 0; int i = 0, t = 0; for (int w : worker) { while (i < n && job.get(i)[0] <= w) { t = Math.max(t, job.get(i++)[1]); } res += t; } return res; } } -
class Solution { public: int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) { int n = difficulty.size(); vector<pair<int, int>> job; for (int i = 0; i < n; ++i) { job.push_back({difficulty[i], profit[i]}); } sort(job.begin(), job.end()); sort(worker.begin(), worker.end()); int i = 0, t = 0; int res = 0; for (auto w : worker) { while (i < n && job[i].first <= w) { t = max(t, job[i++].second); } res += t; } return res; } }; -
class Solution: def maxProfitAssignment( self, difficulty: List[int], profit: List[int], worker: List[int] ) -> int: n = len(difficulty) job = [(difficulty[i], profit[i]) for i in range(n)] job.sort(key=lambda x: x[0]) worker.sort() i = t = res = 0 for w in worker: while i < n and job[i][0] <= w: t = max(t, job[i][1]) i += 1 res += t return res -
func maxProfitAssignment(difficulty []int, profit []int, worker []int) int { var job [][2]int for i := range difficulty { job = append(job, [2]int{difficulty[i], profit[i]}) } sort.SliceStable(job, func(i, j int) bool { return job[i][0] <= job[j][0] }) sort.Ints(worker) i, t, n, res := 0, 0, len(difficulty), 0 for _, w := range worker { for i < n && job[i][0] <= w { t = max(t, job[i][1]) i++ } res += t } return res } -
function maxProfitAssignment(difficulty: number[], profit: number[], worker: number[]): number { const n = profit.length; worker.sort((a, b) => a - b); const jobs = Array.from({ length: n }, (_, i) => [difficulty[i], profit[i]]); jobs.sort((a, b) => a[0] - b[0]); let [ans, mx, i] = [0, 0, 0]; for (const w of worker) { while (i < n && jobs[i][0] <= w) { mx = Math.max(mx, jobs[i++][1]); } ans += mx; } return ans; } -
class Solution { public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int m = Arrays.stream(difficulty).max().getAsInt(); int[] f = new int[m + 1]; int n = profit.length; for (int i = 0; i < n; ++i) { int d = difficulty[i]; f[d] = Math.max(f[d], profit[i]); } for (int i = 1; i <= m; ++i) { f[i] = Math.max(f[i], f[i - 1]); } int ans = 0; for (int w : worker) { ans += f[Math.min(w, m)]; } return ans; } } -
class Solution { public: int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) { int m = *max_element(begin(difficulty), end(difficulty)); int f[m + 1]; memset(f, 0, sizeof(f)); int n = profit.size(); for (int i = 0; i < n; ++i) { int d = difficulty[i]; f[d] = max(f[d], profit[i]); } for (int i = 1; i <= m; ++i) { f[i] = max(f[i], f[i - 1]); } int ans = 0; for (int w : worker) { ans += f[min(w, m)]; } return ans; } }; -
class Solution: def maxProfitAssignment( self, difficulty: List[int], profit: List[int], worker: List[int] ) -> int: m = max(difficulty) f = [0] * (m + 1) for d, p in zip(difficulty, profit): f[d] = max(f[d], p) for i in range(1, m + 1): f[i] = max(f[i], f[i - 1]) return sum(f[min(w, m)] for w in worker) -
func maxProfitAssignment(difficulty []int, profit []int, worker []int) (ans int) { m := slices.Max(difficulty) f := make([]int, m+1) for i, d := range difficulty { f[d] = max(f[d], profit[i]) } for i := 1; i <= m; i++ { f[i] = max(f[i], f[i-1]) } for _, w := range worker { ans += f[min(w, m)] } return } -
function maxProfitAssignment(difficulty: number[], profit: number[], worker: number[]): number { const m = Math.max(...difficulty); const f = Array(m + 1).fill(0); const n = profit.length; for (let i = 0; i < n; ++i) { const d = difficulty[i]; f[d] = Math.max(f[d], profit[i]); } for (let i = 1; i <= m; ++i) { f[i] = Math.max(f[i], f[i - 1]); } return worker.reduce((acc, w) => acc + f[Math.min(w, m)], 0); }