From 6ac9ec66e8247659e4f8bb6246bc8f17e0533832 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Fri, 24 Jan 2025 13:44:17 +0800 Subject: [PATCH] 20250124 finished. --- src/problem/mod.rs | 2 + ...2944_minimum_number_of_coins_for_fruits.rs | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/problem/p2944_minimum_number_of_coins_for_fruits.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 11fa6a4..69bbfb2 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -450,3 +450,5 @@ mod p2218_maximum_value_of_k_coins_from_piles; mod p1561_maximum_number_of_coins_you_can_get; mod p2920_maximum_points_after_collecting_coins_from_all_nodes; + +mod p2944_minimum_number_of_coins_for_fruits; diff --git a/src/problem/p2944_minimum_number_of_coins_for_fruits.rs b/src/problem/p2944_minimum_number_of_coins_for_fruits.rs new file mode 100644 index 0000000..1ccca53 --- /dev/null +++ b/src/problem/p2944_minimum_number_of_coins_for_fruits.rs @@ -0,0 +1,47 @@ +/** + * [2944] Minimum Number of Coins for Fruits + */ +pub struct Solution {} + +// submission codes start here +use std::collections::VecDeque; + +impl Solution { + pub fn minimum_coins(prices: Vec) -> i32 { + let n = prices.len(); + // (滑动窗口的右侧, dp[i]) + let mut queue = VecDeque::from([(n + 1, 0)]); + + for i in (1..=n).rev() { + while queue.back().unwrap().0 > i * 2 + 1 { + queue.pop_back(); + } + + let dp = prices[i - 1] + queue.back().unwrap().1; + while dp <= queue.front().unwrap().1 { + queue.pop_front(); + } + + queue.push_front((i, dp)); + } + + queue.front().unwrap().1 + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2944() { + assert_eq!(4, Solution::minimum_coins(vec![3, 1, 2])); + assert_eq!(2, Solution::minimum_coins(vec![1, 10, 1, 1])); + assert_eq!( + 39, + Solution::minimum_coins(vec![26, 18, 6, 12, 49, 7, 45, 45]) + ); + } +}