76 lines
1.7 KiB
Rust
76 lines
1.7 KiB
Rust
use std::io::{read_to_string, stdin};
|
|
|
|
const DAY_START: usize = 0;
|
|
const DAY_END: usize = 1440;
|
|
|
|
fn virtual_allocation(spaces: &mut Vec<usize>, tasks: &Vec<usize>, task_idx: usize) -> bool {
|
|
if task_idx == tasks.len() {
|
|
return true;
|
|
}
|
|
|
|
let task_time = tasks[task_idx];
|
|
|
|
for i in 0..spaces.len() {
|
|
if spaces[i] >= task_time {
|
|
spaces[i] -= task_time;
|
|
if virtual_allocation(spaces, tasks, task_idx + 1) {
|
|
return true;
|
|
}
|
|
spaces[i] += task_time;
|
|
}
|
|
}
|
|
|
|
false
|
|
}
|
|
|
|
fn main() {
|
|
let mut temp = read_to_string(stdin()).unwrap();
|
|
|
|
let mut iter = temp.split_whitespace().map(|x| x.parse::<usize>().unwrap());
|
|
|
|
let n = iter.next().unwrap();
|
|
let k = iter.next().unwrap();
|
|
|
|
let mut pre_tasks = (0..n)
|
|
.map(|_| (iter.next().unwrap(), iter.next().unwrap()))
|
|
.collect::<Vec<(usize, usize)>>();
|
|
|
|
pre_tasks.sort_by_key(|&(start, _)| start);
|
|
|
|
let mut times_task_to_add = (0..k).map(|_| iter.next().unwrap()).collect::<Vec<usize>>();
|
|
|
|
let mut occupied_time = [false; DAY_END - DAY_START];
|
|
|
|
for (start, end) in pre_tasks {
|
|
for time in start..end {
|
|
occupied_time[time] = true;
|
|
}
|
|
}
|
|
|
|
let mut empty_space = vec![];
|
|
|
|
let mut cumulative = 0;
|
|
for time in DAY_START..DAY_END {
|
|
if !occupied_time[time] {
|
|
cumulative += 1;
|
|
} else {
|
|
if cumulative > 0 {
|
|
empty_space.push(cumulative);
|
|
}
|
|
cumulative = 0;
|
|
}
|
|
}
|
|
|
|
if cumulative > 0 {
|
|
empty_space.push(cumulative);
|
|
}
|
|
|
|
//
|
|
|
|
if virtual_allocation(&mut empty_space, ×_task_to_add, 0) {
|
|
println!("GOOD");
|
|
} else {
|
|
println!("BAD");
|
|
}
|
|
}
|