From 51c1825b4b217b38656305e85e7a1dadee25467f Mon Sep 17 00:00:00 2001 From: subho Date: Thu, 16 Oct 2025 18:46:16 +0530 Subject: [PATCH] Implement solution for maximum task assignment problem --- ...Maximum Number of Tasks You Can Assign.cpp | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 2071. Maximum Number of Tasks You Can Assign.cpp diff --git a/2071. Maximum Number of Tasks You Can Assign.cpp b/2071. Maximum Number of Tasks You Can Assign.cpp new file mode 100644 index 0000000..50fc665 --- /dev/null +++ b/2071. Maximum Number of Tasks You Can Assign.cpp @@ -0,0 +1,55 @@ +class Solution { +public: + bool check(vector& tasks, vector& workers, int pills, int strength, int mid) { + int pillsUsed = 0; + multiset st(begin(workers), begin(workers) + mid); //best mid workers + + for(int i = mid-1; i >= 0; i--) { + int reqrd = tasks[i]; + auto it = prev(st.end()); + + if(*it >= reqrd) { + st.erase(it); + } else if(pillsUsed >= pills) { + return false; + } else { + //find the weakest worker which can do this strong task using pills + auto weakestWorkerIt = st.lower_bound(reqrd - strength); + if(weakestWorkerIt == st.end()) { + return false; + } + st.erase(weakestWorkerIt); + pillsUsed++; + } + } + + return true; + } + int maxTaskAssign(vector& tasks, vector& workers, int pills, int strength) { + int m = tasks.size(); + int n = workers.size(); + + int l = 0; + int r = min(m, n); + + sort(begin(tasks), end(tasks)); + sort(begin(workers), end(workers), greater()); + + int result = 0; + + while(l <= r) { + int mid = l + (r-l)/2; + + if(check(tasks, workers, pills, strength, mid)) { + result = mid; + l = mid+1; + } else { + r = mid-1; + } + } + + return result; + + + } +};