From 473f02c2696805e02f029b633c34c3f97bcac2d3 Mon Sep 17 00:00:00 2001 From: li-chx Date: Fri, 11 Jul 2025 09:26:00 +0800 Subject: [PATCH] =?UTF-8?q?3169.=20=E6=97=A0=E9=9C=80=E5=BC=80=E4=BC=9A?= =?UTF-8?q?=E7=9A=84=E5=B7=A5=E4=BD=9C=E6=97=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 84 ++++++++++------------------------------------------- 1 file changed, 15 insertions(+), 69 deletions(-) diff --git a/src/main.rs b/src/main.rs index 40a6225..6b60f9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,81 +2,27 @@ use std::cmp::max; struct Solution; impl Solution { - pub fn max_free_time(event_time: i32, start_time: Vec, end_time: Vec) -> i32 { - let mut first_selection = 0; - let mut second_selection = 0; - let mut third_selection = 0; - - if end_time[end_time.len() - 1] < event_time { - first_selection = event_time - end_time[end_time.len() - 1]; + pub fn count_days(mut days: i32, mut meetings: Vec>) -> i32 { + meetings.sort_by(|a, b| a[0].cmp(&b[0])); + let mut ans = 0; + let mut last_end = 1; + for c in meetings.iter() { + if last_end >= c[0] { + last_end = max(last_end, c[1] + 1); + continue; + } + ans += c[0] - last_end; + last_end = c[1] + 1; } - let mut last_time = 0; - for i in 0..start_time.len() { - if start_time[i] > last_time { - let val = start_time[i] - last_time; - if val > first_selection { - third_selection = second_selection; - second_selection = first_selection; - first_selection = val; - } else if val > second_selection { - third_selection = second_selection; - second_selection = val; - } else if val > third_selection { - third_selection = val; - } - } - last_time = end_time[i]; - } - - let check_can_add = |left_space: i32, right_space: i32, needed: i32| -> bool { - if needed <= third_selection { - return true; - } - if needed <= second_selection { - if left_space == second_selection && right_space == first_selection || - left_space == first_selection && right_space == second_selection { - return false; - } - return true; - } - if needed <= first_selection { - if left_space != first_selection && right_space != first_selection { - return true; - } - } - return false; - }; - last_time = end_time[0]; - let mut last = start_time[0]; - let mut ans = start_time[0]; - for i in 1..start_time.len() { - let left_space = last; - let right_space = start_time[i] - last_time; - let new_val = if check_can_add(left_space, right_space, end_time[i - 1] - start_time[i - 1]) { - left_space + right_space + end_time[i - 1] - start_time[i - 1] - } else { - left_space + right_space - }; - ans = max(ans, new_val); - last = right_space; - last_time = end_time[i]; - } - { - let left_space = last; - let right_space = event_time - last_time; - let new_val = if check_can_add(left_space, right_space, end_time[end_time.len() - 1] - start_time[end_time.len() - 1]) { - left_space + right_space + end_time[end_time.len() - 1] - - start_time[end_time.len() - 1] - } else { - left_space + right_space - }; - ans = max(ans, new_val); + days += 1; + if days > last_end { + ans += days - last_end; } ans } } fn main() { - let sl = Solution::max_free_time(5, vec![1, 3], vec![2, 5]); + let sl = Solution::count_days(10, vec![vec![5, 7], vec![1, 3], vec![9, 10]]); println!("{}", sl); }