36 lines
897 B
Rust
36 lines
897 B
Rust
|
use std::collections::HashMap;
|
||
|
|
||
|
pub fn task_scheduler(tasks: &[char], coldown: u8) -> u16 {
|
||
|
let mut num_tasks = HashMap::new();
|
||
|
for task in tasks {
|
||
|
*num_tasks.entry(task).or_insert(0) += 1;
|
||
|
}
|
||
|
|
||
|
let mut num_tasks: Vec<(&&char, &i32)> = num_tasks.iter().collect();
|
||
|
num_tasks.sort_by(|a, b| b.1.cmp(a.1));
|
||
|
|
||
|
let mut result = 0;
|
||
|
let mut pos = 0;
|
||
|
let mut range = 1;
|
||
|
|
||
|
for _ in 0..tasks.len() {
|
||
|
if num_tasks.get(pos as usize).is_none() {
|
||
|
result += if pos > coldown as u16 {
|
||
|
0
|
||
|
} else {
|
||
|
coldown as u16 - pos + 1
|
||
|
};
|
||
|
pos = 0;
|
||
|
range += 1;
|
||
|
}
|
||
|
if *num_tasks.get(pos as usize).unwrap().1 < range {
|
||
|
result += coldown as u16 - pos;
|
||
|
pos = 0;
|
||
|
range += 1;
|
||
|
}
|
||
|
result += 1;
|
||
|
pos += 1;
|
||
|
}
|
||
|
result
|
||
|
}
|