結果
問題 | No.2855 Move on Grid |
ユーザー | InTheBloom |
提出日時 | 2024-08-25 14:11:08 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 426 ms / 3,000 ms |
コード長 | 1,890 bytes |
コンパイル時間 | 4,706 ms |
コンパイル使用メモリ | 179,184 KB |
実行使用メモリ | 25,156 KB |
最終ジャッジ日時 | 2024-08-25 14:11:26 |
合計ジャッジ時間 | 16,048 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 92 ms
11,440 KB |
testcase_01 | AC | 133 ms
12,212 KB |
testcase_02 | AC | 85 ms
11,376 KB |
testcase_03 | AC | 61 ms
11,484 KB |
testcase_04 | AC | 42 ms
6,944 KB |
testcase_05 | AC | 88 ms
11,576 KB |
testcase_06 | AC | 96 ms
11,032 KB |
testcase_07 | AC | 11 ms
6,944 KB |
testcase_08 | AC | 72 ms
11,604 KB |
testcase_09 | AC | 37 ms
6,944 KB |
testcase_10 | AC | 351 ms
25,156 KB |
testcase_11 | AC | 355 ms
13,480 KB |
testcase_12 | AC | 344 ms
13,752 KB |
testcase_13 | AC | 348 ms
13,408 KB |
testcase_14 | AC | 340 ms
24,436 KB |
testcase_15 | AC | 385 ms
24,184 KB |
testcase_16 | AC | 343 ms
23,904 KB |
testcase_17 | AC | 347 ms
13,592 KB |
testcase_18 | AC | 340 ms
13,280 KB |
testcase_19 | AC | 352 ms
13,968 KB |
testcase_20 | AC | 377 ms
14,748 KB |
testcase_21 | AC | 394 ms
14,772 KB |
testcase_22 | AC | 419 ms
13,656 KB |
testcase_23 | AC | 386 ms
13,248 KB |
testcase_24 | AC | 377 ms
14,380 KB |
testcase_25 | AC | 403 ms
15,484 KB |
testcase_26 | AC | 388 ms
13,360 KB |
testcase_27 | AC | 386 ms
13,320 KB |
testcase_28 | AC | 413 ms
13,696 KB |
testcase_29 | AC | 385 ms
14,060 KB |
testcase_30 | AC | 384 ms
22,364 KB |
testcase_31 | AC | 409 ms
24,028 KB |
testcase_32 | AC | 398 ms
24,768 KB |
testcase_33 | AC | 403 ms
25,004 KB |
testcase_34 | AC | 426 ms
13,432 KB |
testcase_35 | AC | 384 ms
24,844 KB |
testcase_36 | AC | 376 ms
18,828 KB |
testcase_37 | AC | 396 ms
24,776 KB |
testcase_38 | AC | 409 ms
24,248 KB |
testcase_39 | AC | 381 ms
24,260 KB |
ソースコード
import std; void main () { int N, M, K; readln.read(N, M, K); auto A = new int[][](N, 0); foreach (i; 0..N) A[i] = readln.split.to!(int[]); // 上下左右に動けることを誤読していた... // x未満に動くかどうか?で01bfsをすればよいですね。 auto dp = new int[][](N, M); auto q = DList!(Tuple!(int, int))(); const dxy = [ [0, 1], [0, -1], [1, 0], [-1, 0], ]; bool is_in (int y, int x) { return 0 <= y && y < N && 0 <= x && x < M; } bool f (int bord) { foreach (d; dp) d[] = int.max; dp[0][0] = 0; if (A[0][0] < bord) dp[0][0] = 1; q.insertBack(tuple(0, 0)); while (!q.empty()) { auto pos = q.front(); q.removeFront(); int y = pos[0], x = pos[1]; foreach (d; dxy) { int ny = y + d[0], nx = x + d[1]; if (!is_in(ny, nx)) continue; if (dp[ny][nx] < int.max) continue; // コスト0遷移 if (bord <= A[ny][nx]) { dp[ny][nx] = dp[y][x]; q.insertFront(tuple(ny, nx)); } // コスト1遷移 if (A[ny][nx] < bord) { dp[ny][nx] = dp[y][x] + 1; q.insertBack(tuple(ny, nx)); } } } return dp[N - 1][M - 1] <= K; } int ok = 1, ng = 10 ^^ 9 + 1; while (1 < abs(ok - ng)) { int mid = (ok + ng) / 2; if (f(mid)) { ok = mid; } else { ng = mid; } } writeln(ok); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }