公式

D - 気温の統一 / Uniform Temperature 解説 by sounansya


\(\displaystyle f(T)=\sum_{i=1}^NS_i\times |T-P_i|\) とします。\(f(T)\) の最小値を求めれば良いです。

\(f(T)\) は \(T=P_1,P_2,\ldots,P_N\) のいずれかで最小値を取ります。また、\((P_i,S_i)\) を \(P\) の昇順にソートすると、\(\displaystyle f(P_k)=\sum_{i=1}^NS_i\times |P_k-P_i|=\sum_{i=1}^{k-1}S_i\times (P_k-P_i)+\sum_{i=k}^NS_i\times (P_k-P_i)\) となり、これは事前に累積和を計算することで \(O(1)\) で計算できます。

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

n = int(input())
a = []
sum_s, sum_ps = 0, 0
for i in range(n):
    s, p = map(int, input().split())
    a.append((p, s))
    sum_s += s
    sum_ps += p * s
a.sort()
ans = 9 * 10**18
now_s, now_ps = 0, 0
for i in range(n):
    ans = min(ans, 2 * a[i][0] * now_s - 2 * now_ps + sum_ps - a[i][0] * sum_s)
    now_s += a[i][1]
    now_ps += a[i][0] * a[i][1]
print(ans)

投稿日時:
最終更新: