C - Approximate Equalization 2 Editorial by chro4896

ソートしない方法

操作の前後で整数列\(A\)の総和は変化しないため、その値を\(S\)とします。
総和が変化しないことを考慮すると、最小値と最大値の差が\(1\)以下になったとき、数列の各項の値は\( \lfloor \frac{S}{N} \rfloor \)\(\lceil \frac{S}{N} \rceil\)のいずれかである必要があります。
ただし、\(\lfloor x \rfloor\)\(x\)以下の最大の整数を表し、\(\lceil x \rceil\)\(x\)以上の最小の整数を表すこととします。

ここで問題文で与えられた操作を分解して、整数列\(A\)の好きな項を\(1\)加算する操作と、好きな項を\(1\)減算する操作をそれぞれ好きな回数行うことができるとします。
このとき、整数列\(A\)の全ての項の値を\( \lfloor \frac{S}{N} \rfloor \)\(\lceil \frac{S}{N} \rceil\)のいずれかにするのに必要な、\(1\)加算する操作の回数と、\(1\)減算する操作の回数をそれぞれ考えます。
つまり、\(A_{i}\)\(\frac{S}{N}\)以下であるような全ての\(i\)に対する\(\lfloor \frac{S}{N} \rfloor -A_{i}\)の値の総和と、\(A_{i}\)\(\frac{S}{N}\)より大きいような全ての\(i\)に対する\(A_{i}-\lceil \frac{S}{N} \rceil\)の値の総和をそれぞれ考えます。
すると、この2つの値の最大値が、実はこの問題で求めるべき値です。

上で求めた値は、整数列\(A\)の全ての項の値を\( \lfloor \frac{S}{N} \rfloor \)\(\lceil \frac{S}{N} \rceil\)のいずれかにするのに必要な各種操作の回数であるため、この問題で求めるべき値がこの値以上であることはわかります。
また、この問題における操作は順序を入れ替えても結果が変わらないため、\(1\)加算する操作の回数と\(1\)減算する操作の回数が等しい場合は、それらの操作を適当に組み合わせることで、この問題で指定されている操作とみなすことができます。
一致しない場合も、整数列\(A\)の最小値と最大値を変化させないように、少ない方の操作を行うことで、2つの操作の回数を等しくすることができます。
厳密には、このような操作が可能であることを確認する必要がありますが、整数列の総和を考慮すれば明らかなため、ここでは省略します。
以上により、上で求めた回数だけの操作で整数列\(A\)の最小値と最大値の差を\(1\)以下にできることが確認できました。

posted:
last update: