826. Most Profit Assigning Work

You have n jobs and m workers. You are given three arrays: difficultyprofit, and worker where:

  • difficulty[i] and profit[i] are the difficulty and the profit of the ith job, and
  • worker[j] is the ability of jth worker (i.e., the jth worker can only complete a job with difficulty at most worker[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.length
  • n == profit.length
  • m == worker.length
  • 1 <= n, m <= 104
  • 1 <= difficulty[i], profit[i], worker[i] <= 105

Approach 01:

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {
        int total_profit = 0;
        vector<pair<int, int>> jobs;

        // Pair up difficulty and profit for each job
        for (int i = 0; i < difficulty.size(); ++i)
            jobs.emplace_back(difficulty[i], profit[i]);

        // Sort jobs by difficulty and worker by their ability
        sort(jobs.begin(), jobs.end());
        sort(worker.begin(), worker.end());

        int job_index = 0;
        int max_profit_so_far = 0;

        // Iterate over each worker's ability
        for (const int ability : worker) {
            // Find the maximum profit job the worker can do
            while (job_index < jobs.size() &&
                   ability >= jobs[job_index].first) {
                max_profit_so_far =
                    max(max_profit_so_far, jobs[job_index].second);
                ++job_index;
            }
            // Add the maximum profit the worker can achieve to the total profit
            total_profit += max_profit_so_far;
        }

        return total_profit;
    }
};
from typing import List

class Solution:
    def maxProfitAssignment(self, difficulty: List[int], profit: List[int], worker: List[int]) -> int:
        total_profit = 0
        jobs = []

        # Pair up difficulty and profit for each job
        for i in range(len(difficulty)):
            jobs.append((difficulty[i], profit[i]))

        # Sort jobs by difficulty and worker by their ability
        jobs.sort()
        worker.sort()

        job_index = 0
        max_profit_so_far = 0

        # Iterate over each worker's ability
        for ability in worker:
            # Find the maximum profit job the worker can do
            while job_index < len(jobs) and ability >= jobs[job_index][0]:
                max_profit_so_far = max(max_profit_so_far, jobs[job_index][1])
                job_index += 1
            # Add the maximum profit the worker can achieve to the total profit
            total_profit += max_profit_so_far

        return total_profit

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top