結果
問題 | No.1345 Beautiful BINGO |
ユーザー |
![]() |
提出日時 | 2025-03-31 17:54:58 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,386 bytes |
コンパイル時間 | 305 ms |
コンパイル使用メモリ | 82,328 KB |
実行使用メモリ | 196,360 KB |
最終ジャッジ日時 | 2025-03-31 17:56:42 |
合計ジャッジ時間 | 7,387 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 20 TLE * 1 -- * 40 |
ソースコード
import heapq def main(): import sys N, M = map(int, sys.stdin.readline().split()) A = [] for _ in range(N): A.append(list(map(int, sys.stdin.readline().split()))) lines = [] # Rows (0-based) for i in range(N): row = [(i, j) for j in range(N)] lines.append(row) # Columns for j in range(N): col = [(i, j) for i in range(N)] lines.append(col) # Diagonals diag1 = [(i, i) for i in range(N)] diag2 = [(i, N-1 - i) for i in range(N)] lines.append(diag1) lines.append(diag2) # Precompute mask and sum for each line lines_info = [] for line in lines: mask = 0 sum_val = 0 for (i, j) in line: sum_val += A[i][j] bit = i * N + j mask |= 1 << bit lines_info.append({'mask': mask, 'sum_val': sum_val, 'cells': line}) # Priority queue: (current_sum, current_mask) heap = [] heapq.heappush(heap, (0, 0)) # Dictionary to track the minimal sum for each mask min_sum = {0: 0} found = False while heap: current_sum, current_mask = heapq.heappop(heap) # Check if this is the best sum for current_mask if min_sum.get(current_mask, float('inf')) < current_sum: continue # Check number of covered lines count = 0 for info in lines_info: line_mask = info['mask'] if (current_mask & line_mask) == line_mask: count += 1 if count >= M: print(current_sum) found = True break # Explore adding each line for info in lines_info: line_mask = info['mask'] new_mask = current_mask | line_mask additional_sum = 0 for (i, j) in info['cells']: bit = i * N + j if not (current_mask & (1 << bit)): additional_sum += A[i][j] new_sum = current_sum + additional_sum # Update if this new_mask has a lower sum if new_sum < min_sum.get(new_mask, float('inf')): min_sum[new_mask] = new_sum heapq.heappush(heap, (new_sum, new_mask)) if not found: print(-1) # Should not happen per problem statement if __name__ == "__main__": main()