結果

問題 No.2094 Symmetry
ユーザー LyricalMaestro
提出日時 2025-09-27 01:53:24
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,006 ms / 2,000 ms
コード長 1,572 bytes
コンパイル時間 891 ms
コンパイル使用メモリ 82,592 KB
実行使用メモリ 123,080 KB
最終ジャッジ日時 2025-09-27 01:53:49
合計ジャッジ時間 23,548 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 34
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://yukicoder.me/problems/no/2094


def main():
    N, K = map(int, input().split())
    S = []
    for _ in range(2 * N):
        S.append(input())
    
    C = []
    for _ in range(2 * N):
        C.append(list(map(int, input().split())))
    
    # 黒の数を足し合わせる
    black_num = 0
    for i in range(2 * N):
        for j in range(2 * N):
            if S[i][j] == "#":
                black_num += 1
    
    # 何も考えずに最適化する
    array = []
    for i in range(2 * N):
        for j in range(2 * N):
            array.append((C[i][j], i, j))
    
    array.sort(reverse=True)
    answer = 0
    cells = [[False] * (2 * N ) for _ in range(2 * N)]
    for index in range(black_num):
        c, i, j = array[index]
        answer += c
        cells[i][j] = True

    is_symmetry = True
    for i in range(2 * N):
        for j in range(N):
            if cells[i][j] != cells[i][2 * N - 1 - j]:
                is_symmetry = False
                break
    
    if is_symmetry:
        answer += K

    # あらかじめ対称性を狙っていく
    if black_num % 2 == 0:
        black_pair_num = black_num // 2
        array = []
        for i in range(2 * N):
            for j in range(N):
                c1 = C[i][j]
                c2 = C[i][2 * N - 1 - j]
                array.append(c1 + c2)
        array.sort(reverse=True)
        ans = K
        for i in range(black_pair_num):
            ans += array[i]
        answer = max(ans, answer)
    
    print(answer)

    








if __name__ == "__main__":
    main()
0