2023-09-07 ABC113 を解いた
ABC113 : AtCoder Beginner Contest 113
- A - Discount Fare
https://atcoder.jp/contests/abc113/tasks/abc113_a
- 提出: https://atcoder.jp/contests/abc113/submissions/45309304
x + y / 2
- B - Palace
https://atcoder.jp/contests/abc113/tasks/abc113_b
- 提出: https://atcoder.jp/contests/abc113/submissions/45309688
- 浮動小数点数によるバグが怖いので 1000 倍した
- C - ID
https://atcoder.jp/contests/abc113/tasks/abc113_c
- 提出: https://atcoder.jp/contests/abc113/submissions/45309941
- 市の番号を保持しておく
- 県・年で昇順にソートし、県ごとに市を数えて認識番号をつくる
- 市の番号でソートして認識番号を出力する
- D - Number of Amidakuji
https://atcoder.jp/contests/abc113/tasks/abc113_d
- 提出: https://atcoder.jp/contests/abc113/submissions/45311219
- あみだくじをシミュレートするのは明らかに厳しい
- ある縦位置での横棒の引かれ方は
W <= 8
なので全探索できる - ある縦位置でのある横棒に来る場合の数を DP で求める
- 上から順に縦位置を走査し、横棒の引き方をすべて試して棒があれば横からなければ上から値を持ってくる
- DP の下の縦位置での K 番目の位置の値が答えになる
- 縦棒が 1 本しかないケースに注意
use proconio::{input, marker::Usize1};
fn main() {
input! {
h: usize,
w: usize,
k: Usize1,
};
if w == 1 {
println!("1");
return;
}
let mut dp = vec![vec![0; w]; h + 1];
dp[0][0] = 1_usize;
for i in 0..h {
for bits in 0..(1 << (w - 1)) {
let js = (0..w - 1)
.map(|i| ((bits >> i) & 1) == 1)
.collect::<Vec<bool>>();
let mut ok = true;
let mut p = false;
for (_, b) in js.iter().copied().enumerate() {
if p && b {
ok = false;
break;
}
p = b;
}
if !ok {
continue;
}
for j in 0..w {
if j == 0 {
if js[j] {
dp[i + 1][j] += dp[i][j + 1];
dp[i + 1][j] %= 1_000_000_007;
} else {
dp[i + 1][j] += dp[i][j];
dp[i + 1][j] %= 1_000_000_007;
}
} else if j == w - 1 {
if js[j - 1] {
dp[i + 1][j] += dp[i][j - 1];
dp[i + 1][j] %= 1_000_000_007;
} else {
dp[i + 1][j] += dp[i][j];
dp[i + 1][j] %= 1_000_000_007;
}
} else {
if js[j - 1] {
dp[i + 1][j] += dp[i][j - 1];
dp[i + 1][j] %= 1_000_000_007;
}
if js[j] {
dp[i + 1][j] += dp[i][j + 1];
dp[i + 1][j] %= 1_000_000_007;
}
if !js[j - 1] && !js[j] {
dp[i + 1][j] += dp[i][j];
dp[i + 1][j] %= 1_000_000_007;
}
}
}
}
}
let ans = dp[h][k];
println!("{}", ans);
}
今日のコミット。
- rust-atcoder 1 commit
- kireta 2 commits