『アルゴリズムとデータ構造』を Rust で実装してみるシリーズ。7章の貪欲法。
前回 → https://quantized-cube.com/rust-greedy-01
今回は区間スケジューリング問題。
use proconio::input;
// 区間を (i64, i64) で表す
type Interval = (i64, i64);
fn input(use_default_values: bool) -> (usize, Vec<Interval>) {
if use_default_values {
let n = 6;
let inter = vec![(9, 16), (11, 15), (19, 23), (10, 12), (14, 18), (13, 19)];
return (n, inter);
} else {
println!("Input n and inter:");
input! {
n: usize,
inter: [(i64, i64); n],
}
return (n, inter);
}
}
/// 区間スケジューリング問題に対する貪欲法
pub fn code_7_2(use_default_values: bool) -> usize {
// 入力
let (n, mut inter) = input(use_default_values);
// 終端時刻が早い順にソートする
// inter.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
inter.sort_by_key(|a| a.1);
// 貪欲に選ぶ
let mut res = 0;
let mut current_end_time = 0;
for i in 0..n {
// 最後に選んだ区間と被るのは除く
if inter[i].0 < current_end_time {
continue;
}
res += 1;
current_end_time = inter[i].1;
}
res
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn code_7_2_works() {
assert_eq!(code_7_2(true), 3);
}
}
GitHub のリポジトリはこちら https://github.com/quantized-cube/book_algorithm_solution_rust
コメント