『アルゴリズムとデータ構造』を Rust で実装してみるシリーズ。7章の貪欲法。
前回 → https://quantized-cube.com/rust-greedy-02
今回は Multiple Array (AtCoder Grand Contest 009 A)
use proconio::input;
fn input(use_default_values: bool) -> (usize, Vec<u64>, Vec<u64>) {
if use_default_values {
let n = 7;
let a = vec![3, 4, 5, 2, 5, 5, 9];
let b = vec![1, 1, 9, 6, 3, 8, 7];
return (n, a, b);
} else {
println!("Input n and a_b_pair:");
input! {
n: usize,
a_b_pair: [(u64, u64); n],
}
let mut a: Vec<u64> = Vec::new();
let mut b: Vec<u64> = Vec::new();
for item in a_b_pair.into_iter() {
a.push(item.0);
b.push(item.1);
}
return (n, a, b);
}
}
/// Multiple Array の解答例
pub fn code_7_3(use_default_values: bool) -> u64 {
// 入力
let (n, mut a, b) = input(use_default_values);
// 答え
let mut sum = 0;
for i in (0..n).rev() {
a[i] += sum; // 前回までの操作回数を足す
let remainder = a[i] % b[i];
let mut d = 0;
if remainder != 0 {
d = b[i] - remainder;
}
sum += d;
}
sum
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn code_7_3_works() {
assert_eq!(code_7_3(true), 22);
}
}
GitHub のリポジトリはこちら https://github.com/quantized-cube/book_algorithm_solution_rust
コメント