A - 花壇の水やり / Watering the Flower Bed Editorial by admin
GPT 5.2 High概要
各花壇の水量 \(A_i\) に対して「1リットル追加(1円)」だけが許されるとき、全ての水量を同じにするための最小費用を求めます。
考察
この操作では水を「減らす」ことができず、「増やす」ことしかできません。
したがって、最終的に全ての花壇の水量を同じ値 \(X\) に揃えるには、必ず \(X \ge \max(A_i)\) を満たす必要があります(最大値の花壇を減らせないため)。
ここで、目標値を \(X\) とすると必要な追加量(費用)は - 花壇 \(i\) に対して \(X - A_i\) リットル - 合計で \(\sum_{i=1}^{N} (X - A_i)\) 円 です。
この式は \(X\) が大きくなるほど単調に増加します(\(X\) を 1 増やすと全花壇で合計 \(N\) だけ増える)。
よって最小になるのは、条件を満たす最小の \(X\)、つまり
- \(X = \max(A_i)\)
のときです。
具体例:\(A=[2,5,4]\) のとき、\(\max(A)=5\)。
\(X=5\) に揃えるには \((5-2)+(5-5)+(5-4)=3+0+1=4\) 円。
\(X=6\) にすると \((6-2)+(6-5)+(6-4)=4+1+2=7\) 円で増えてしまい、最小ではありません。
素朴に「1リットルずつ追加する操作」を愚直にシミュレーションすると、差が最大で \(10^9\) あり得るため現実的な時間で終わりません(TLEの原因)。
必要なのは操作の回数そのものを数えるのではなく、差分の合計を一気に計算することです。
アルゴリズム
- 配列 \(A\) の最大値 \(mx=\max(A)\) を求める。
- 答えを \(\sum_{i=1}^{N} (mx - A_i)\) として計算する。
- その合計を出力する。
計算量
- 時間計算量: \(O(N)\)(最大値の計算と合計計算)
- 空間計算量: \(O(1)\)(入力配列を除く追加領域)
実装のポイント
答えは最大で \(N \times (10^9-1)\) 程度になり得るので、言語によっては 64bit 整数型を使う必要があります(Python は自動で多倍長整数なので安心)。
入力が大きいので、Python では
sys.stdin.readlineを使うと安定します。ソースコード
import sys
def main():
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
mx = max(A)
ans = sum(mx - a for a in A)
print(ans)
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。