結果
| 問題 |
No.2855 Move on Grid
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-02-11 10:45:01 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 747 ms / 3,000 ms |
| コード長 | 1,581 bytes |
| コンパイル時間 | 660 ms |
| コンパイル使用メモリ | 82,236 KB |
| 実行使用メモリ | 118,820 KB |
| 最終ジャッジ日時 | 2025-02-11 10:45:29 |
| 合計ジャッジ時間 | 22,057 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
from collections import deque
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(n)]
INF = 10 ** 10
def f(x):
# 0-1 BFS を用いて、(0,0)から(n-1,m-1)までの必要な修正回数の最小値を求める
dist = [[INF] * m for _ in range(n)]
dq = deque()
# スタートセルでは、A[0][0]>=xなら修正不要(コスト0)、そうでなければ修正(コスト1)
start_cost = 0 if A[0][0] >= x else 1
dist[0][0] = start_cost
dq.append((0, 0))
while dq:
i, j = dq.popleft()
for di, dj in ((0, 1), (1, 0), (0, -1), (-1, 0)): # 上下左右全ての方向
ni, nj = i + di, j + dj
if 0 <= ni < n and 0 <= nj < m:
# 次のセルに入るとき、A[ni][nj]がx未満なら修正が必要
add = 0 if A[ni][nj] >= x else 1
if dist[ni][nj] > dist[i][j] + add:
dist[ni][nj] = dist[i][j] + add
# コストが0なら前に、1なら後ろに追加(0-1 BFSのテクニック)
if add == 0:
dq.appendleft((ni, nj))
else:
dq.append((ni, nj))
return dist[n - 1][m - 1]
# 二分探索:答えの候補は 0〜10^9 の間
l, r = 0, 10 ** 9 + 1
while r - l > 1:
mid = (l + r) // 2
# midを最低値とする経路が、k回以内の修正で実現できるか判定
if f(mid) > k:
r = mid
else:
l = mid
print(l)