2589. 完成所有任务的最少时间

This commit is contained in:
li-chx 2025-11-20 21:55:57 +08:00
parent 8c281d865f
commit 30e2df43c4
1 changed files with 29 additions and 30 deletions

View File

@ -1,40 +1,39 @@
use std::cmp::max; mod arr;
struct Solution; struct Solution;
impl Solution { impl Solution {
pub fn number_of_substrings(s: String) -> i32 { pub fn find_minimum_time(tasks: Vec<Vec<i32>>) -> i32 {
let s = s.chars().collect::<Vec<char>>(); let mut tasks = tasks;
let mut ans = 0; tasks.sort_by_key(|task| task[1]);
let mut zeros: Vec<usize> = Vec::new(); let mut stack:Vec<Vec<i32>> = Vec::new();
stack.push(vec![-2,-2,0]);
for i in 0..s.len() { for task in tasks.iter() {
if s[i] == '0' { let start = task[0];
zeros.push(i); let end = task[1];
let mut d = task[2];
let pos = stack.partition_point(|x| x[0] < start) - 1;
d -= stack[stack.len() - 1][2] - stack[pos][2];
if start <= stack[pos][1] {
d -= stack[pos][1] - start + 1;
} }
let mut local_ans =( if zeros.len() == 0 { if d <= 0{
i + 1 continue;
} else {
i - zeros[zeros.len() - 1]
}) as i32;
let mut ones = local_ans;
let zeros_len = zeros.len()as i32;
for l in (max(0, zeros_len - 200) ..zeros_len).rev() {
let l_index = l as usize;
let zeros_l_index = zeros[l_index] as i32;
let zero_start_index = if l == 0 { -1 } else { zeros[l_index - 1] as i32 };
let need_ones = max(0, (zeros_len - l) * (zeros_len - l) - ones);
let max_index = zeros_l_index - need_ones;
ones += zeros_l_index - zero_start_index - 1;
if max_index < zero_start_index {
continue;
}
local_ans += max_index - zero_start_index;
} }
ans += local_ans; while end - stack[stack.len() - 1][1] <= d {
let end = stack.pop().unwrap();
d += end[1] - end[0] + 1;
}
stack.push(vec![end - d + 1, end,stack[stack.len() - 1][2] + d]);
} }
ans stack[stack.len() - 1][2]
} }
} }
/*
https://leetcode.cn/problems/minimum-time-to-complete-all-tasks/solutions/2163130/tan-xin-pythonjavacgo-by-endlesscheng-w3k3/
*/
fn main() { fn main() {
let result = Solution::number_of_substrings("0001000011011010010011000100110100110101111111010011000101010110101000".to_string()); let result = Solution::find_minimum_time(arr::make_matrix("[[1,3,2],[2,5,3],[5,6,2]]"));
println!("{:?}", result); println!("{:?}", result);
} }