2023-04-18 椅子を買った / PAST #3 H を解いた
椅子を買った。回転できないのがつらかった。たぶんまた書く。
- PAST #3 H - ハードル走 (第三回 アルゴリズム実技検定 H問題)
https://atcoder.jp/contests/past202005-open/tasks/past202005_h
- https://atcoder.jp/contests/past202005-open/submissions/40749612
- DP
- 0.5 は扱いづらいので距離をすべて 2 倍する
- 行動が開始できる位置はジャンプ中でなくかつ↑の偶数位置に限られている
- ジャンプ中の時間についてもゴールを考慮して保持しておく必要がある
- ゴール位置だけを保持すれば十分そうではある
- ジャンプ中の状態を保持しないならカエルと大差なさそう
use proconio::input;
macro_rules! chmin {
($min_v: expr, $v: expr) => {
if $v < $min_v {
$min_v = $v;
true
} else {
false
}
};
}
fn main() {
input! {
n: usize,
l: usize,
x: [usize; n],
t: [usize; 3],
}
let mut y = vec![false; 2 * l + 8 + 1];
for x_i in x {
y[2 * x_i] = true;
}
let (t1, t2, t3) = (t[0] / 2, t[1] / 2, t[2]);
let inf = 1_usize << 60;
let mut dp = vec![vec![inf; 2]; 2 * l + 8 + 1];
dp[0][0] = 0_usize;
for i in (0..=2 * l).step_by(2) {
chmin!(
dp[i + 2][0],
dp[i][0] + t1 + t1 + if y[i + 2] { t3 } else { 0 }
);
chmin!(
dp[i + 4][0],
dp[i][0] + t1 + t2 * 2 + t1 + if y[i + 4] { t3 } else { 0 }
);
chmin!(
dp[i + 8][0],
dp[i][0] + t1 + t2 * 6 + t1 + if y[i + 8] { t3 } else { 0 }
);
chmin!(dp[i + 2][1], dp[i][0] + t1 + t2);
chmin!(dp[i + 3][1], dp[i][0] + t1 + t2 * 2);
chmin!(dp[i + 4][1], dp[i][0] + t1 + t2 * 3);
chmin!(dp[i + 5][1], dp[i][0] + t1 + t2 * 4);
chmin!(dp[i + 6][1], dp[i][0] + t1 + t2 * 5);
chmin!(dp[i + 7][1], dp[i][0] + t1 + t2 * 6);
}
let ans = *dp[2 * l].iter().min().unwrap();
println!("{}", ans);
}
Hades 弓で失敗。
今日のコミット。
- tsukota 1 commit
- rust-atcoder 1 commit