20250501 finished.
This commit is contained in:
		@@ -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)
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user