結果

問題 No.1028 闇討ち
ユーザー lam6er
提出日時 2025-03-31 17:59:14
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 776 ms / 2,000 ms
コード長 1,148 bytes
コンパイル時間 213 ms
コンパイル使用メモリ 82,656 KB
実行使用メモリ 173,512 KB
最終ジャッジ日時 2025-03-31 18:00:19
合計ジャッジ時間 9,402 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

def compute_sum(x, homes):
    total = 0
    for (a, c) in homes:
        total += max(abs(a - x), c)
    return total

def find_optimal_x(homes, N):
    low = 1
    high = N
    while high - low > 3:
        mid1 = low + (high - low) // 3
        mid2 = high - (high - low) // 3
        s1 = compute_sum(mid1, homes)
        s2 = compute_sum(mid2, homes)
        if s1 < s2:
            high = mid2
        else:
            low = mid1
    min_sum = float('inf')
    for x in range(low, high + 1):
        current = compute_sum(x, homes)
        if current < min_sum:
            min_sum = current
    return min_sum

def main():
    input = sys.stdin.read().split()
    ptr = 0
    N = int(input[ptr])
    ptr += 1
    homes = [[] for _ in range(N + 1)]
    for i in range(N):
        for j in range(N):
            k = int(input[ptr])
            ptr += 1
            a = i + 1
            b = j + 1
            c = abs(b - 1)
            homes[k].append((a, c))
    total = 0
    for k in range(1, N + 1):
        min_sum = find_optimal_x(homes[k], N)
        total += min_sum
    print(total)

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