← 一覧に戻る

D. Minimize Range

問題ページへ

解説(解説を見た)

実験を行うと、aia_i に対して、KK のあまりに置き換えても解が変わらないことが分かります。(証明がうまくできない)

なので、AA をソートし、キューなどを用いて、以下の操作を1周行えば、良いです。

  1. AA の先頭と最後尾の差を求める
  2. 現在持っている解答と比較を行い、小さい方を持っておく
  3. AA の先頭 (=Atop)(=A_{top}) を取り出し、Atop+KA_{top}+KAA の最後尾に入れる
  4. 1 ~ 3 を繰り返す
# キュー構造が欲しいのでデックをインポート
from collections import deque

# 入力を受け取る
n, k = map(int, input().split())
a = list(map(int, input().split()))

# a の各要素に対して k の余りをとる
for i in range(n):
    a[i] %= k

# 昇順でソートする
a.sort()

# a をデックにする
a = deque(a)

# 仮の答えを用意
min_diff = float("inf")

# 1~3 を各ループで行う
for _ in range(n):
    # 1. max(a) - min(a) を求める
    diff = a[n - 1] - a[0]

    # 2. 比較を行い、小さい方を解にする
    min_diff = min(min_diff, diff)

    # 3. 先頭を取り出し、 k を足して後ろに入れる
    top = a.popleft()
    top += k
    a.append(top)

print(min_diff)

提出コード(Rust)
https://atcoder.jp/contests/abc450/submissions/74545647