ABC107 : AtCoder Beginner Contest 107 の A, B, C を解いた。
- A - Train
https://atcoder.jp/contests/abc107/tasks/abc107_a
- 提出: https://atcoder.jp/contests/abc107/submissions/37752387
n - (i - 1)
- B - Grid Compression
https://atcoder.jp/contests/abc107/tasks/abc107_b
- 提出: https://atcoder.jp/contests/abc107/submissions/37752509
- ひとつも
'#'
のない行、ひとつも'#'
のない列を調べておく - 上記のいずれかに該当する場合は出力しない、とすれば答えになる
- C - Candles
https://atcoder.jp/contests/abc107/tasks/arc101_a
- 提出: https://atcoder.jp/contests/abc107/submissions/37753501
- 左に進んだ後で右に進むか (左に 0 進むこともある) その逆かしかない
- 考察は難しくないけど実装のハマりどころが多い
- 0 があると 2 回踏んだりしてややこしいので、最初に minus, zero, plus で分ける
- zero があれば K を減らしてしまう
- ここで K がゼロになるケースに注意 (入力例にあるためこれは大丈夫なはず)
- あとは minus から a 個、 plus から K - a 個取ればいい
- minus or plus から 0 個とる場合の参照位置に注意 (Rust だと usize が負になるとエラーになるので気づく)
use proconio::input; fn main() { input! { n: usize, k: usize, x: [i64; n], }; let mut minus = vec![]; let mut zero = vec![]; let mut plus = vec![]; for x_i in x.iter().copied() { match x_i.cmp(&0) { std::cmp::Ordering::Less => minus.push(x_i), std::cmp::Ordering::Equal => zero.push(x_i), std::cmp::Ordering::Greater => plus.push(x_i), } } minus.reverse(); let k = if zero.is_empty() { k } else { k - 1 }; if k == 0 { println!("0"); return; } let mut ans = 1 << 60; for cm in 0..=k { if cm > minus.len() { continue; } let cp = k - cm; if cp > plus.len() { continue; } let d_minus = if cm == 0 { 0 } else { minus[cm - 1].abs() }; let d_plus = if cp == 0 { 0 } else { plus[cp - 1] }; ans = ans.min(d_minus * 2 + d_plus).min(d_minus + d_plus * 2); } println!("{}", ans); }
今日のコミット。
- rust-examples 2 commits
- rust-atcoder 1 commit