問題概要
個の整数とが与えられる。
個の整数を個のペアにし、全てのペアに対しその総和をで割ったときの余りの最大値を最小化したい。最小でいくつにできるか。
がとなるようにソートしても当然答えは変わりません。以後は既にソートしてあるものとします。
ステップ1 最大値の最小化といえば
そう、二分探索ですね。答えを以下にできるかという判定がでできるなら、この問題は二分探索でで解くことができ、これは間に合いそうです。しかし、簡単にはいかなそうです。もし和を以下にできるかという問題なら、ある数に対してその数との和が以下にできる最大の数を取ればよいです。ただ、今回はで割った余りを以下にできるかという話ですので、合わせるべき数が一意に定まるとは限りません。初手の二分探索は難しそうです。
ステップ2 余りを取らないとする
ステップ1で「和を以下にできるかという問題なら、ある数に対してその数との和が以下にできる最大の数を取ればよい」と話しましたが、そもそもこの問題(個のペアの総和の最大値を最小化したときの値)ならば、が答えであるのは感覚的に分かるでしょう。下に証明を書きます。
として、整数があるとします(ソートしてあるものとします)。この時の答えはであることを示します。ととを対応させるとします。その場合の答えは明らかにですが、これはなのでこのペアは必ずしも最適ではありません。
次にととを対応させるとします。その場合の答えは明らかにですが、これはなのでこのペアも必ずしも最適ではありません。
よって、この問題は個の整数がいかなる値でも答えはです。これはのときでも適当にペアを作った後、任意につのペアを選びこのように組み替えることで答えを最小化していくことができます。これを繰り返すと上の結論(が答え)が示せます。
この構造を、余りを取る場合にも作れないだろうかと考えてみます。結論から言うと、あるつのペアを選んだ時にそのペアが共に未満もしくは以上ならこれが使えます。
ステップ3 種類ある場合
つまり選んだつのペアが未満のペアと以上のペアつずつで構成されている場合です。選んだペアつに含まれるつの数を小さい順にとします。
この時、ありえるのはのペアが未満かつのペアが以上のパターン(これをパターンとします)、のペアが未満かつのペアが以上のパターン(これをパターンとします)、のペアが未満かつのペアが以上のパターン(これをパターンとします)、のペアが未満かつのペアが以上のパターン(これをパターンとします)のいずれかです
パターンの場合:
操作前の答えはです。なぜなら<より、%<<が示せるからです。
しかし、これをパターンの形にすると、各ペアの未満もしくは以上という関係は変わらないので答えはもしくは%<となり、いずれにせよ操作前の答えより増えることはないのは明らかです。
パターン、パターンも同様に示すことができます。(証明は略)
よって、つのペアが未満のペアと以上のペアつずつで構成されている場合はパターンのようにするのが最適です。
以上より、つのペアを選んだ時に最適となる組み換えの方法が分かりました。これを繰り返すことによって、最適となるペアの組み方のつに「そこより左は全て未満のペア、右は全て以上のペアとなる境界をつ定め、左側右側のペアの組み方は端から順に取っていくことで構成することでできるもの」があることが分かります。
ステップ4 からへ
境界の位置をひとつ固定した後は、境界の左側/右側でペアを作り、各ペアが未満/以上であることを確かめた後、答えを求めればいいですが、計算量はで時間制限に間に合いません。
ここで、境界に関する以下の事実を踏まえます。
境界が左であるほど、境界の左側の各ペアは未満になりやすくなる。
境界が左であるほど、境界の右側の各ペアは以上になりにくくなる。
境界が左であるほど、全ペアの余りの最大値は小さくなる。
よって、境界の位置を二分探索し、条件を満たすような最も左の境界を求め、そのときの全ペアの余りの最大値を求めれば、答えが求まります。
この場合の計算量はであり、間に合います。
感想
最大値の最小化というところから二分探索をしたい気持ちがありますが、まさかそれを使うのはあの場所か...というのが面白かったです。
にはすぐたどり着きましたが、それをにするのは難しかったです。