Maximum Number of Tasks You Can Assign

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from sortedcontainers import SortedList

class Solution:
    def maxTaskAssign(self, tasks, workers, pills, strength):
        tasks = sorted(tasks)
        workers = sorted(workers)

        def check(num_tasks):
            available_workers = SortedList(workers[-num_tasks:])
            remaining_pills = pills

            for task_strength in tasks[:num_tasks][::-1]:
                suitable_worker_index = available_workers.bisect_left(task_strength)
                if suitable_worker_index < len(available_workers):
                    available_workers.pop(suitable_worker_index)
                elif remaining_pills > 0:
                    adjusted_worker_index = available_workers.bisect_left(task_strength - strength)
                    if adjusted_worker_index < len(available_workers):
                        available_workers.pop(adjusted_worker_index)
                        remaining_pills -= 1
                else:
                    return False

            return len(available_workers) == 0

        begin, end = 0, min(len(workers), len(tasks)) + 1
        while begin + 1 < end:
            mid = (begin + end)//2
            if check(mid):
                begin = mid
            else:
                end = mid

        return begin