結果
| 問題 |
No.2855 Move on Grid
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2024-08-25 17:37:52 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,995 ms / 3,000 ms |
| コード長 | 1,205 bytes |
| コンパイル時間 | 536 ms |
| コンパイル使用メモリ | 82,040 KB |
| 実行使用メモリ | 134,512 KB |
| 最終ジャッジ日時 | 2024-08-25 17:38:33 |
| 合計ジャッジ時間 | 39,746 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
from collections import deque
from collections.abc import Iterator
def neighbors4(r: int, c: int) -> Iterator[tuple[int, int]]:
for dr, dc in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nr = r + dr
nc = c + dc
if not (0 <= nr < N and 0 <= nc < M): continue
yield nr, nc
INF = 1 << 60
N, M, K = map(int, input().split())
A = []
for _ in range(N):
A.append(list(map(int, input().split())))
# 最小スコア m として到達可能か?(K 回だけマスを書き換え可能)
def bfs01(m: int) -> bool:
g = [[INF] * M for _ in range(N)]
q = deque([(0, 0)])
g[0][0] = 1 if A[0][0] < m else 0
while q:
r, c = q.popleft()
if r == N-1 and c == M-1: break
for nr, nc in neighbors4(r, c):
if g[nr][nc] != INF: continue
if A[nr][nc] < m:
g[nr][nc] = g[r][c] + 1
q.append((nr, nc))
else:
g[nr][nc] = g[r][c]
q.appendleft((nr, nc))
return g[N-1][M-1] <= K
lo = 1
hi = 10 ** 9
ans = lo
while lo <= hi:
m = (lo + hi) // 2
if bfs01(m):
lo = m + 1
ans = max(ans, m)
else:
hi = m - 1
print(ans)
norioc