結果
問題 | No.2955 Pizza Delivery Plan |
ユーザー | atcoder8 |
提出日時 | 2024-11-08 22:58:02 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 390 ms / 2,000 ms |
コード長 | 2,454 bytes |
コンパイル時間 | 14,122 ms |
コンパイル使用メモリ | 378,228 KB |
実行使用メモリ | 66,176 KB |
最終ジャッジ日時 | 2024-11-08 22:58:24 |
合計ジャッジ時間 | 21,984 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,248 KB |
testcase_03 | AC | 1 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 1 ms
5,248 KB |
testcase_08 | AC | 58 ms
16,256 KB |
testcase_09 | AC | 62 ms
16,384 KB |
testcase_10 | AC | 117 ms
20,096 KB |
testcase_11 | AC | 165 ms
23,936 KB |
testcase_12 | AC | 212 ms
27,776 KB |
testcase_13 | AC | 246 ms
31,616 KB |
testcase_14 | AC | 281 ms
35,328 KB |
testcase_15 | AC | 310 ms
39,296 KB |
testcase_16 | AC | 325 ms
43,136 KB |
testcase_17 | AC | 350 ms
47,104 KB |
testcase_18 | AC | 335 ms
50,816 KB |
testcase_19 | AC | 351 ms
54,656 KB |
testcase_20 | AC | 359 ms
58,624 KB |
testcase_21 | AC | 355 ms
62,336 KB |
testcase_22 | AC | 385 ms
66,176 KB |
testcase_23 | AC | 390 ms
66,176 KB |
testcase_24 | AC | 362 ms
66,176 KB |
testcase_25 | AC | 196 ms
27,904 KB |
testcase_26 | AC | 166 ms
23,936 KB |
testcase_27 | AC | 115 ms
20,224 KB |
testcase_28 | AC | 348 ms
50,944 KB |
testcase_29 | AC | 350 ms
54,656 KB |
testcase_30 | AC | 369 ms
66,176 KB |
ソースコード
use proconio::input; const ORIGIN: (f64, f64) = (0.0, 0.0); fn main() { input! { (n, k): (usize, usize), xy: [(f64, f64); n], } // dp[S][i][j] // S: 既に完了した注文の集合 // i: 現在位置 // j: 手持ちのピザの個数 let mut dp: Vec<Vec<Vec<Option<f64>>>> = vec![vec![vec![None; k]; n + 1]; 1 << n]; for pos in 0..n { dp[1 << pos][pos][k - 1] = Some(calc_distance(ORIGIN, xy[pos])); } for bits in 0_usize..1 << n { for from in 0..n { for num_pizzas in 0..k { let Some(cost) = dp[bits][from][num_pizzas] else { continue; }; for to in 0..n { if bits >> to & 1 == 1 { continue; } if num_pizzas >= 1 { chmin_for_option( &mut dp[bits | 1 << to][to][num_pizzas - 1], cost + calc_distance(xy[from], xy[to]), ); } chmin_for_option( &mut dp[bits | 1 << to][to][k - 1], cost + calc_distance_via_origin(xy[from], xy[to]), ); } } } } let mut min_cost = None; for pos in 0..n { for num_pizzas in 0..k { if let Some(cost) = dp[(1 << n) - 1][pos][num_pizzas] { chmin_for_option(&mut min_cost, cost + calc_distance(xy[pos], ORIGIN)); } } } println!("{}", min_cost.unwrap()); } fn calc_distance(coord1: (f64, f64), coord2: (f64, f64)) -> f64 { (coord1.0 - coord2.0).hypot(coord1.1 - coord2.1) } fn calc_distance_via_origin(coord1: (f64, f64), coord2: (f64, f64)) -> f64 { calc_distance(coord1, ORIGIN) + calc_distance(ORIGIN, coord2) } /// If `value` is `None` or contains a value greater than `cand_value`, update it to `Some(cand_value)`. /// /// Returns whether `value` has been updated or not as a bool value. /// /// # Arguments /// /// * `value` - Reference variable to be updated. /// * `cand_value` - Candidate value for update. pub fn chmin_for_option<T>(value: &mut Option<T>, cand_value: T) -> bool where T: PartialOrd, { if value.as_ref().is_some_and(|cost| cost <= &cand_value) { return false; } *value = Some(cand_value); true }