2023-01-05 ABC107 の A, B, C を解いた
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