公式

C - おやつの分配 / Snack Distribution 解説 by sounansya 印刷ページ


\(d[i]\) を「お菓子 \(1\) から \(i\) までを高橋君・青木君にそれぞれ分配したときに、高橋君が受け取るお菓子の美味しさの合計と青木君が受け取るお菓子の美味しさの合計の差としてあり得る値の集合」と定義します。

\(d[i]\) は \(d[i-1]\) と \(A_i\) から簡単に計算することができます。また、答えは \(d[N]\) の要素の絶対値の最小値です。

実装例(Python3)

import sys

input = sys.stdin.readline
n = int(input())
a = list(map(int, input().split()))
d = set([0])
for v in a:
    dd = set()
    for u in d:
        dd.add(u - v)
        dd.add(u + v)
    d = dd
print(min(abs(u) for u in d))

投稿日時:
最終更新: