From 25f8703b391e5ff3ed9edf11bd25c6a6464c6939 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Thu, 1 May 2025 15:29:57 +0800 Subject: [PATCH] 20250501 finished. --- src/problem/mod.rs | 2 + ..._maximum_number_of_tasks_you_can_assign.rs | 108 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index b4d0100..e2e8e85 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -626,3 +626,5 @@ mod p3392_count_subarrays_of_length_three_with_a_condition; mod p2302_count_subarrays_with_score_less_than_k; mod p2962_count_subarrays_where_max_element_appears_at_least_k_times; + +mod p2071_maximum_number_of_tasks_you_can_assign; diff --git a/src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs b/src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs new file mode 100644 index 0000000..a89af34 --- /dev/null +++ b/src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs @@ -0,0 +1,108 @@ +/** + * [2071] Maximum Number of Tasks You Can Assign + */ +pub struct Solution {} + +// submission codes start here +use std::collections::VecDeque; + +impl Solution { + pub fn max_task_assign( + mut tasks: Vec, + mut workers: Vec, + pills: i32, + strength: i32, + ) -> i32 { + let (n, m) = (tasks.len(), workers.len()); + + tasks.sort_unstable(); + workers.sort_unstable(); + + let check = |middle: usize| -> bool { + // 注意middle的溢出问题 + if middle < 1 { + return true; + } + + let mut p = pills; + let mut worker_queue = VecDeque::new(); + let mut ptr = m - 1; + + for i in (0..=middle - 1).rev() { + while ptr >= m - middle && workers[ptr] + strength >= tasks[i] { + worker_queue.push_front(workers[ptr]); + + if ptr == 0 { + break; + } + ptr -= 1; + } + + if worker_queue.is_empty() { + return false; + } + + let last = worker_queue.back().unwrap(); + + if *last >= tasks[i] { + worker_queue.pop_back(); + } else { + if p == 0 { + return false; + } + + p -= 1; + worker_queue.pop_front(); + } + } + + return true; + }; + + let (mut left, mut right) = (1, m.min(n)); + let mut result = 0; + + while left <= right { + let middle = (left + right) / 2; + if check(middle) { + result = middle; + left = middle + 1; + } else { + right = middle - 1; + } + } + + result as i32 + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2071() { + assert_eq!( + 1, + Solution::max_task_assign(vec![35], vec![83, 20, 4, 66], 3, 41) + ); + assert_eq!( + 3, + Solution::max_task_assign(vec![3, 2, 1], vec![0, 3, 3], 1, 1) + ); + assert_eq!( + 1, + Solution::max_task_assign(vec![5, 4], vec![0, 0, 0], 1, 5) + ); + assert_eq!( + 2, + Solution::max_task_assign(vec![10, 15, 30], vec![0, 10, 10, 10, 10], 3, 10) + ); + assert_eq!( + 3, + Solution::max_task_assign(vec![5, 9, 8, 5, 9], vec![1, 6, 4, 2, 6], 1, 5) + ); + } +}