Skip to content

Commit b9dd2c8

Browse files
committed
Add problem 2283: Minimum Hours of Training to Win a Competition
1 parent 0dc7c5a commit b9dd2c8

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,6 +1773,7 @@ pub mod problem_2379_minimum_recolors_to_get_k_consecutive_black_blocks;
17731773
pub mod problem_2380_time_needed_to_rearrange_a_binary_string;
17741774
pub mod problem_2381_shifting_letters_ii;
17751775
pub mod problem_2382_maximum_segment_sum_after_removals;
1776+
pub mod problem_2383_minimum_hours_of_training_to_win_a_competition;
17761777

17771778
#[cfg(test)]
17781779
mod test_utilities;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
pub struct Solution;
2+
3+
// ------------------------------------------------------ snip ------------------------------------------------------ //
4+
5+
use std::iter;
6+
7+
impl Solution {
8+
pub fn min_number_of_hours(
9+
initial_energy: i32,
10+
initial_experience: i32,
11+
energy: Vec<i32>,
12+
experience: Vec<i32>,
13+
) -> i32 {
14+
let mut current_energy = initial_energy as u32;
15+
let mut current_experience = initial_experience as u32;
16+
let mut result = 0;
17+
18+
iter::zip(&energy, &experience).for_each(|(&required_energy, &required_experience)| {
19+
let (required_energy, required_experience) = (required_energy as u32, required_experience as u32);
20+
21+
if current_energy <= required_energy {
22+
result += required_energy + 1 - current_energy;
23+
current_energy = 1;
24+
} else {
25+
current_energy -= required_energy;
26+
}
27+
28+
if current_experience <= required_experience {
29+
result += required_experience + 1 - current_experience;
30+
current_experience = required_experience + 1;
31+
}
32+
33+
current_experience += required_experience;
34+
});
35+
36+
result as _
37+
}
38+
}
39+
40+
// ------------------------------------------------------ snip ------------------------------------------------------ //
41+
42+
impl super::Solution for Solution {
43+
fn min_number_of_hours(
44+
initial_energy: i32,
45+
initial_experience: i32,
46+
energy: Vec<i32>,
47+
experience: Vec<i32>,
48+
) -> i32 {
49+
Self::min_number_of_hours(initial_energy, initial_experience, energy, experience)
50+
}
51+
}
52+
53+
#[cfg(test)]
54+
mod tests {
55+
#[test]
56+
fn test_solution() {
57+
super::super::tests::run::<super::Solution>();
58+
}
59+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
pub mod iterative;
2+
3+
pub trait Solution {
4+
fn min_number_of_hours(initial_energy: i32, initial_experience: i32, energy: Vec<i32>, experience: Vec<i32>)
5+
-> i32;
6+
}
7+
8+
#[cfg(test)]
9+
mod tests {
10+
use super::Solution;
11+
12+
pub fn run<S: Solution>() {
13+
let test_cases = [
14+
((5, 3, &[1, 4, 3, 2] as &[_], &[2, 6, 3, 1] as &[_]), 8),
15+
((2, 4, &[1], &[3]), 0),
16+
];
17+
18+
for ((initial_energy, initial_experience, energy, experience), expected) in test_cases {
19+
assert_eq!(
20+
S::min_number_of_hours(initial_energy, initial_experience, energy.to_vec(), experience.to_vec()),
21+
expected
22+
);
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)