結果
問題 | 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 dequeimport sysinput = sys.stdin.readlinen, m, k = map(int, input().split())A = [list(map(int, input().split())) for _ in range(n)]INF = 10 ** 10def 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 1dist[0][0] = start_costdq.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 + djif 0 <= ni < n and 0 <= nj < m:# 次のセルに入るとき、A[ni][nj]がx未満なら修正が必要add = 0 if A[ni][nj] >= x else 1if 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 + 1while r - l > 1:mid = (l + r) // 2# midを最低値とする経路が、k回以内の修正で実現できるか判定if f(mid) > k:r = midelse:l = midprint(l)