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 p2302_count_subarrays_with_score_less_than_k;
|
||||||
mod p2962_count_subarrays_where_max_element_appears_at_least_k_times;
|
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