結果

問題 No.2099 [Cherry Alpha B] Time Machine
ユーザー phspls
提出日時 2022-10-15 00:18:39
言語 Rust
(1.83.0 + proconio)
結果
WA  
実行時間 -
コード長 1,936 bytes
コンパイル時間 18,765 ms
コンパイル使用メモリ 378,536 KB
実行使用メモリ 315,912 KB
最終ジャッジ日時 2024-06-26 18:21:47
合計ジャッジ時間 41,433 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 59 WA * 13
権限があれば一括ダウンロードができます

ソースコード

diff #

use std::{collections::BinaryHeap, cmp::Reverse};

const INF: usize = 1usize << 60;
const OFFSET: usize = 10000001;

fn main() {
    let mut t = String::new();
    std::io::stdin().read_line(&mut t).ok();
    let t: isize = t.trim().parse().unwrap();
    let mut xa = String::new();
    std::io::stdin().read_line(&mut xa).ok();
    let xa: Vec<usize> = xa.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
    let x = xa[0];
    let a = xa[1];
    let mut yb = String::new();
    std::io::stdin().read_line(&mut yb).ok();
    let yb: Vec<usize> = yb.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
    let y = yb[0];
    let b = yb[1];

    let (t, start_cost) = if t < 0 {
            let temp = t.abs() as usize / b + if t / b as isize == 0 { 0 } else { 1 };
            let s = (b * temp) as isize + t;
            (s, temp * y)
        } else {
            let temp = t as usize / a;
            let s = t - (a * temp) as isize;
            (s, temp * x)
        };
    let t = (t + OFFSET as isize) as usize;
    let goal = t as usize;
    let mut checked = vec![INF; OFFSET*2+1];
    checked[OFFSET] = start_cost;
    let mut pque = BinaryHeap::new();
    pque.push((Reverse(start_cost), OFFSET));
    while let Some((Reverse(cost), pos)) = pque.pop() {
        if checked[goal] <= cost { break; }
        if checked[pos] < cost { continue; }
        if pos+1 < checked.len() && pos+1 <= goal && checked[pos+1] > cost + 1 {
            pque.push((Reverse(cost+1), pos+1));
            checked[pos+1] = cost+1;
        }
        if pos+a < checked.len() && pos < goal && checked[pos+a] > cost + x {
            pque.push((Reverse(cost+x), pos+a));
            checked[pos+a] = cost+x;
        }
        if pos >= b && pos > goal && checked[pos-b] > cost + y {
            pque.push((Reverse(cost+y), pos-b));
            checked[pos-b] = cost+y;
        }
    }
    println!("{}", checked[goal]);
}
0