Welcome to Subscribe On Youtube

2071. Maximum Number of Tasks You Can Assign

Description

You have n tasks and m workers. Each task has a strength requirement stored in a 0-indexed integer array tasks, with the ith task requiring tasks[i] strength to complete. The strength of each worker is stored in a 0-indexed integer array workers, with the jth worker having workers[j] strength. Each worker can only be assigned to a single task and must have a strength greater than or equal to the task's strength requirement (i.e., workers[j] >= tasks[i]).

Additionally, you have pills magical pills that will increase a worker's strength by strength. You can decide which workers receive the magical pills, however, you may only give each worker at most one magical pill.

Given the 0-indexed integer arrays tasks and workers and the integers pills and strength, return the maximum number of tasks that can be completed.

 

Example 1:

Input: tasks = [3,2,1], workers = [0,3,3], pills = 1, strength = 1
Output: 3
Explanation:
We can assign the magical pill and tasks as follows:
- Give the magical pill to worker 0.
- Assign worker 0 to task 2 (0 + 1 >= 1)
- Assign worker 1 to task 1 (3 >= 2)
- Assign worker 2 to task 0 (3 >= 3)

Example 2:

Input: tasks = [5,4], workers = [0,0,0], pills = 1, strength = 5
Output: 1
Explanation:
We can assign the magical pill and tasks as follows:
- Give the magical pill to worker 0.
- Assign worker 0 to task 0 (0 + 5 >= 5)

Example 3:

Input: tasks = [10,15,30], workers = [0,10,10,10,10], pills = 3, strength = 10
Output: 2
Explanation:
We can assign the magical pills and tasks as follows:
- Give the magical pill to worker 0 and worker 1.
- Assign worker 0 to task 0 (0 + 10 >= 10)
- Assign worker 1 to task 1 (10 + 10 >= 15)
The last pill is not given because it will not make any worker strong enough for the last task.

 

Constraints:

  • n == tasks.length
  • m == workers.length
  • 1 <= n, m <= 5 * 104
  • 0 <= pills <= m
  • 0 <= tasks[i], workers[j], strength <= 109

Solutions

  • class Solution {
        private int[] tasks;
        private int[] workers;
        private int strength;
        private int pills;
        private int m;
        private int n;
    
        public int maxTaskAssign(int[] tasks, int[] workers, int pills, int strength) {
            Arrays.sort(tasks);
            Arrays.sort(workers);
            this.tasks = tasks;
            this.workers = workers;
            this.strength = strength;
            this.pills = pills;
            n = tasks.length;
            m = workers.length;
            int left = 0, right = Math.min(m, n);
            while (left < right) {
                int mid = (left + right + 1) >> 1;
                if (check(mid)) {
                    left = mid;
                } else {
                    right = mid - 1;
                }
            }
            return left;
        }
    
        private boolean check(int x) {
            int i = 0;
            Deque<Integer> q = new ArrayDeque<>();
            int p = pills;
            for (int j = m - x; j < m; ++j) {
                while (i < x && tasks[i] <= workers[j] + strength) {
                    q.offer(tasks[i++]);
                }
                if (q.isEmpty()) {
                    return false;
                }
                if (q.peekFirst() <= workers[j]) {
                    q.pollFirst();
                } else if (p == 0) {
                    return false;
                } else {
                    --p;
                    q.pollLast();
                }
            }
            return true;
        }
    }
    
  • class Solution {
    public:
        int maxTaskAssign(vector<int>& tasks, vector<int>& workers, int pills, int strength) {
            sort(tasks.begin(), tasks.end());
            sort(workers.begin(), workers.end());
            int n = tasks.size(), m = workers.size();
            int left = 0, right = min(m, n);
            auto check = [&](int x) {
                int p = pills;
                deque<int> q;
                int i = 0;
                for (int j = m - x; j < m; ++j) {
                    while (i < x && tasks[i] <= workers[j] + strength) {
                        q.push_back(tasks[i++]);
                    }
                    if (q.empty()) {
                        return false;
                    }
                    if (q.front() <= workers[j]) {
                        q.pop_front();
                    } else if (p == 0) {
                        return false;
                    } else {
                        --p;
                        q.pop_back();
                    }
                }
                return true;
            };
            while (left < right) {
                int mid = (left + right + 1) >> 1;
                if (check(mid)) {
                    left = mid;
                } else {
                    right = mid - 1;
                }
            }
            return left;
        }
    };
    
  • class Solution:
        def maxTaskAssign(
            self, tasks: List[int], workers: List[int], pills: int, strength: int
        ) -> int:
            def check(x):
                i = 0
                q = deque()
                p = pills
                for j in range(m - x, m):
                    while i < x and tasks[i] <= workers[j] + strength:
                        q.append(tasks[i])
                        i += 1
                    if not q:
                        return False
                    if q[0] <= workers[j]:
                        q.popleft()
                    elif p == 0:
                        return False
                    else:
                        p -= 1
                        q.pop()
                return True
    
            n, m = len(tasks), len(workers)
            tasks.sort()
            workers.sort()
            left, right = 0, min(n, m)
            while left < right:
                mid = (left + right + 1) >> 1
                if check(mid):
                    left = mid
                else:
                    right = mid - 1
            return left
    
    
  • func maxTaskAssign(tasks []int, workers []int, pills int, strength int) int {
    	sort.Ints(tasks)
    	sort.Ints(workers)
    	n, m := len(tasks), len(workers)
    	left, right := 0, min(m, n)
    	check := func(x int) bool {
    		p := pills
    		q := []int{}
    		i := 0
    		for j := m - x; j < m; j++ {
    			for i < x && tasks[i] <= workers[j]+strength {
    				q = append(q, tasks[i])
    				i++
    			}
    			if len(q) == 0 {
    				return false
    			}
    			if q[0] <= workers[j] {
    				q = q[1:]
    			} else if p == 0 {
    				return false
    			} else {
    				p--
    				q = q[:len(q)-1]
    			}
    		}
    		return true
    	}
    	for left < right {
    		mid := (left + right + 1) >> 1
    		if check(mid) {
    			left = mid
    		} else {
    			right = mid - 1
    		}
    	}
    	return left
    }
    

All Problems

All Solutions