結果
| 問題 |
No.1345 Beautiful BINGO
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 20:59:10 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,476 bytes |
| コンパイル時間 | 172 ms |
| コンパイル使用メモリ | 82,388 KB |
| 実行使用メモリ | 124,832 KB |
| 最終ジャッジ日時 | 2025-06-12 21:03:00 |
| 合計ジャッジ時間 | 4,579 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 5 TLE * 1 -- * 55 |
ソースコード
import sys
import heapq
def main():
N, M = map(int, sys.stdin.readline().split())
A = []
for _ in range(N):
A.append(list(map(int, sys.stdin.readline().split())))
lines = []
# Rows
for i in range(N):
cells = set()
total = 0
for j in range(N):
cells.add((i, j))
total += A[i][j]
lines.append((total, frozenset(cells)))
# Columns
for j in range(N):
cells = set()
total = 0
for i in range(N):
cells.add((i, j))
total += A[i][j]
lines.append((total, frozenset(cells)))
# Diagonals
cells = set()
total = 0
for i in range(N):
j = i
cells.add((i, j))
total += A[i][j]
lines.append((total, frozenset(cells)))
cells = set()
total = 0
for i in range(N):
j = N - 1 - i
cells.add((i, j))
total += A[i][j]
lines.append((total, frozenset(cells)))
all_lines = lines
heap = []
visited = {}
initial_mask = 0
initial_sum = 0
heapq.heappush(heap, (initial_sum, initial_mask))
visited[(initial_mask, 0)] = initial_sum
min_total = float('inf')
num_lines = len(all_lines)
while heap:
current_sum, current_mask = heapq.heappop(heap)
k = bin(current_mask).count('1')
if k >= M:
if current_sum < min_total:
min_total = current_sum
continue
if (current_mask, k) in visited and visited[(current_mask, k)] < current_sum:
continue
for i in range(num_lines):
if not (current_mask & (1 << i)):
new_mask = current_mask | (1 << i)
new_k = k + 1
line_sum, line_cells = all_lines[i]
combined_cells = set()
for bit in range(num_lines):
if new_mask & (1 << bit):
combined_cells.update(all_lines[bit][1])
new_sum = sum(A[i][j] for (i, j) in combined_cells)
state = (new_mask, new_k)
if state in visited:
if visited[state] <= new_sum:
continue
visited[state] = new_sum
heapq.heappush(heap, (new_sum, new_mask))
print(min_total)
if __name__ == "__main__":
main()
gew1fw