結果
問題 | No.2375 watasou and hibit's baseball |
ユーザー |
![]() |
提出日時 | 2025-03-20 21:18:25 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,871 bytes |
コンパイル時間 | 147 ms |
コンパイル使用メモリ | 82,372 KB |
実行使用メモリ | 107,044 KB |
最終ジャッジ日時 | 2025-03-20 21:19:30 |
合計ジャッジ時間 | 4,838 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 3 TLE * 1 -- * 32 |
ソースコード
def main():import sysinput = sys.stdin.read().split()ptr = 0n = int(input[ptr])ptr +=1A = int(input[ptr])ptr +=1B = int(input[ptr])ptr +=1X = []Y = []K = []for _ in range(n):x = int(input[ptr])ptr +=1y = int(input[ptr])ptr +=1k = int(input[ptr])ptr +=1X.append(x)Y.append(y)K.append(k)max_len = 1INF = (1 << n)# Initialize DP: dp[mask][prev1][prev2_idx]dp = [ [ [-1 for _ in range(n+1)] for __ in range(n)] for ___ in range(1<<n)]from collections import dequequeue = deque()for i in range(n):mask = 1 << iprev1 = iprev2_idx = n # indicates no previous balldp[mask][prev1][prev2_idx] = 1queue.append( (mask, prev1, prev2_idx) )max_len = 1while queue:mask, prev1, prev2_idx = queue.popleft()current_len = dp[mask][prev1][prev2_idx]if current_len == -1:continue # invalid state# Try to add each possible next ballfor next_ball in range(n):if not (mask & (1 << next_ball)):new_mask = mask | (1 << next_ball)m = bin(mask).count('1')j = m +1 # j is the position of next_ball in the new sequence# Calculate distances and differencesdist_prev1_next = abs(X[prev1] - X[next_ball]) + abs(Y[prev1] - Y[next_ball])diff_k_prev1_next = abs(K[prev1] - K[next_ball])cond = Falseif j ==2:# check condition 2 or 3if dist_prev1_next >= A or diff_k_prev1_next >= B:cond = Trueelse:# j >=3, need to check prev2 as well# prev2_idx must be valid ( <n )prev2 = prev2_idxdist_prev2_next = abs(X[prev2] - X[next_ball]) + abs(Y[prev2] - Y[next_ball])sum_dist = dist_prev2_next + dist_prev1_nextif (dist_prev1_next >= A) or (diff_k_prev1_next >= B) or (sum_dist >= A):cond = Trueif cond:new_prev1 = next_ballnew_prev2_idx = prev1 # because the new previous is the current prev1if dp[new_mask][new_prev1][new_prev2_idx] < current_len +1:dp[new_mask][new_prev1][new_prev2_idx] = current_len +1if current_len +1 > max_len:max_len = current_len +1queue.append( (new_mask, new_prev1, new_prev2_idx) )print(max_len)if __name__ == '__main__':main()