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 $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]

Rust Solution

struct Solution;
use std::collections::BTreeMap;

impl Solution {
    fn max_profit_assignment(difficulty: Vec<i32>, profit: Vec<i32>, worker: Vec<i32>) -> i32 {
        let n = difficulty.len();
        let mut btm: BTreeMap<i32, i32> = BTreeMap::new();
        for i in 0..n {
            let v = btm.entry(difficulty[i]).or_default();
            *v = profit[i].max(*v);
        }
        let mut prev = 0;
        for (_, v) in btm.iter_mut() {
            if prev > *v {
                *v = prev;
            }
            prev = *v;
        }
        let mut res = 0;
        for w in worker {
            res += *btm.range(0..=w).rev().map(|(_, v)| v).next().unwrap_or(&0);
        }
        res
    }
}

#[test]
fn test() {
    let difficulty = vec![2, 4, 6, 8, 10];
    let profit = vec![10, 20, 30, 40, 50];
    let worker = vec![4, 5, 6, 7];
    let res = 100;
    assert_eq!(
        Solution::max_profit_assignment(difficulty, profit, worker),
        res
    );
}

Having problems with this solution? Click here to submit an issue on github.