結果
| 問題 |
No.861 ケーキカット
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 21:41:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,193 bytes |
| コンパイル時間 | 152 ms |
| コンパイル使用メモリ | 82,228 KB |
| 実行使用メモリ | 66,368 KB |
| 最終ジャッジ日時 | 2025-06-12 21:45:10 |
| 合計ジャッジ時間 | 2,568 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 21 |
ソースコード
import sys
from itertools import combinations
from collections import deque
def main():
grid = []
for _ in range(5):
row = list(map(int, sys.stdin.readline().split()))
grid.append(row)
total = sum(sum(row) for row in grid)
minimal_diff = float('inf')
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
connected_regions = []
for i in range(5):
for j in range(5):
visited = set()
q = deque()
q.append((i, j))
visited.add((i, j))
regions = []
while q:
x, y = q.popleft()
regions.append((x, y))
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < 5 and 0 <= ny < 5 and (nx, ny) not in visited:
visited.add((nx, ny))
q.append((nx, ny))
connected_regions.append(frozenset(regions))
unique_regions = []
seen = set()
for region in connected_regions:
if region not in seen:
seen.add(region)
unique_regions.append(region)
for i in range(len(unique_regions)):
a1 = unique_regions[i]
sum_a1 = sum(grid[x][y] for x, y in a1)
for j in range(i + 1, len(unique_regions)):
a2 = unique_regions[j]
if a1 & a2:
continue
sum_a2 = sum(grid[x][y] for x, y in a2)
a_total = sum_a1 + sum_a2
b_remaining = set()
for x in range(5):
for y in range(5):
if (x, y) not in a1 and (x, y) not in a2:
b_remaining.add((x, y))
if len(b_remaining) < 2:
continue
q = deque()
q.append((b_remaining.copy(), None))
found = False
while q:
current, parent = q.popleft()
if not current:
continue
if parent is None:
x, y = next(iter(current))
child = current.copy()
child.remove((x, y))
q.append((child, frozenset([(x, y)])))
else:
for cell in current:
x, y = cell
new_region = set(parent)
new_region.add((x, y))
new_region_frozen = frozenset(new_region)
if new_region not in seen:
seen.add(new_region_frozen)
unique_regions.append(new_region)
child = current.copy()
child.remove((x, y))
q.append((child, new_region_frozen))
remaining_set = frozenset(b_remaining)
if remaining_set not in seen:
continue
for region in unique_regions:
if region.issubset(b_remaining):
b1 = region
b2 = b_remaining - b1
if len(b2) == 0 or not is_connected(b2):
continue
if is_connected(b1) and is_connected(b2):
found = True
break
if found:
b_total = total - a_total
diff = abs(a_total - b_total)
if diff < minimal_diff:
minimal_diff = diff
if diff == 0:
print(0)
return
print(minimal_diff)
def is_connected(region):
if not region:
return False
start = next(iter(region))
visited = set()
q = deque([start])
visited.add(start)
while q:
x, y = q.popleft()
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nx, ny = x + dx, y + dy
if (nx, ny) in region and (nx, ny) not in visited:
visited.add((nx, ny))
q.append((nx, ny))
return len(visited) == len(region)
if __name__ == "__main__":
main()
gew1fw