20250501 finished.
This commit is contained in:
parent
879c2b775e
commit
25f8703b39
|
@ -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;
|
||||
|
|
108
src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs
Normal file
108
src/problem/p2071_maximum_number_of_tasks_you_can_assign.rs
Normal file
|
@ -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<i32>,
|
||||
mut workers: Vec<i32>,
|
||||
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)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user