結果
問題 |
No.2375 watasou and hibit's baseball
|
ユーザー |
![]() |
提出日時 | 2025-04-15 23:18:41 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,829 ms / 2,000 ms |
コード長 | 2,532 bytes |
コンパイル時間 | 408 ms |
コンパイル使用メモリ | 81,552 KB |
実行使用メモリ | 274,672 KB |
最終ジャッジ日時 | 2025-04-15 23:20:29 |
合計ジャッジ時間 | 10,290 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
import sys from collections import deque def main(): N, A, B = map(int, sys.stdin.readline().split()) balls = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)] X = [x for x, y, k in balls] Y = [y for x, y, k in balls] K = [k for x, y, k in balls] # Precompute distance and K_diff matrices dist = [[0] * N for _ in range(N)] k_diff = [[0] * N for _ in range(N)] for i in range(N): for j in range(N): dist[i][j] = abs(X[i] - X[j]) + abs(Y[i] - Y[j]) k_diff[i][j] = abs(K[i] - K[j]) dp = dict() max_len = 1 queue = deque() # Initialize with each ball as the first in the sequence for i in range(N): mask = 1 << i state = (-1, i, mask) dp[state] = 1 queue.append((state, 1)) while queue: state, current_len = queue.popleft() if dp.get(state, 0) > current_len: continue # Skip if a better state has already been processed prev_pp, prev_p, mask = state # Try adding each possible next ball for c in range(N): if (mask & (1 << c)) != 0: continue # Skip if ball c is already used new_mask = mask | (1 << c) if prev_pp == -1: # Adding the second ball to the sequence a = prev_p b = c if dist[a][b] >= A or k_diff[a][b] >= B: new_state = (a, b, new_mask) new_len = current_len + 1 if new_len > dp.get(new_state, 0): dp[new_state] = new_len if new_len > max_len: max_len = new_len queue.append((new_state, new_len)) else: # Adding the third or later ball a = prev_pp b = prev_p c_ball = c cond3 = (k_diff[b][c_ball] >= B) cond4 = (dist[b][c_ball] + dist[a][c_ball] >= A) if cond3 or cond4: new_state = (b, c_ball, new_mask) new_len = current_len + 1 if new_len > dp.get(new_state, 0): dp[new_state] = new_len if new_len > max_len: max_len = new_len queue.append((new_state, new_len)) print(max_len) if __name__ == '__main__': main()