結果
| 問題 | No.2366 登校 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-02 02:16:19 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,105 bytes |
| 記録 | |
| コンパイル時間 | 260 ms |
| コンパイル使用メモリ | 96,236 KB |
| 実行使用メモリ | 785,500 KB |
| 最終ジャッジ日時 | 2026-08-02 02:16:28 |
| 合計ジャッジ時間 | 7,648 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 10 MLE * 1 -- * 15 |
ソースコード
## https://yukicoder.me/problems/no/2366
from collections import deque
MAX_INT = 10 ** 18
def main():
N, M, K,T = map(int, input().split())
ab_map = [[None for _ in range(M)] for _ in range(N)]
for _ in range(K):
a, b, c, d = map(int, input().split())
if c > 1:
ab_map[a - 1][b - 1] =(c - 1, d)
answer = MAX_INT
dp = [[{} for _ in range(M)] for _ in range(N)]
dp[0][0][(0, 0)] = 0
queue = deque()
queue.append((0, 0, 0, 0))
while len(queue) > 0:
n, m, revert_time, stress = queue.popleft()
d = dp[n][m][(revert_time, stress)]
for dn, dm in ((-1, 0), (1, 0), (0, -1), (0, 1)):
new_n = dn + n
new_m = dm + m
if 0 <= new_n < N and 0 <= new_m < M:
new_state = (revert_time, stress)
if new_state not in dp[new_n][new_m] or dp[new_n][new_m][new_state] > d + 1:
dp[new_n][new_m][new_state] = d + 1
queue.append((new_n, new_m, revert_time, stress))
if ab_map[n][m] is not None:
c_, d_ = ab_map[n][m]
new_revert_time = revert_time + c_
new_stress = stress + d_
if new_revert_time >= N - 1 + M - 1:
if d - new_revert_time + (N - 1 - n + M - 1 - m) <= T:
answer = min(answer ,new_stress)
else:
if d - new_revert_time + (N - 1 - n + M - 1 - m) <= T:
answer = min(answer ,new_stress)
else:
new_state = (new_revert_time, new_stress)
if new_state not in dp[n][m] or dp[n][m][new_state] > d:
dp[n][m][new_state] = d
queue.appendleft((n, m, new_revert_time, new_stress))
for key_state, t in dp[-1][-1].items():
revert_time, stress = key_state
if t - revert_time <= T:
answer = min(answer, stress)
if answer == MAX_INT:
print(-1)
else:
print(answer)
if __name__ == '__main__':
main()