AGC027 B - Garbage Collector
解法
ゴミを回収しに行く回数(=ゴミを捨てる回数)を回と決め打ちし、そのときの最小値を求めます。
そして、最後にについて全探索して答えを求めることを考えます。
回ゴミを回収しに行くとき、ゴミを拾う回数は回、捨てる回数は回なので、足す必要がありますが、これは値がにしか依存しない(他が定数)ので、これ以降は考えないことにして、最後に足します。
今、1回の収集で個のゴミを拾うことについて考えます。
少し実験するとわかるのですが、ゴミを回収する際は、できるだけ遠い場所に行き、その帰り道にゴミを回収していくのが最も効率がいいです(これは、手持ちのゴミが多いと消費エネルギーが多くなるためです)。
左から番目のゴミを番目(~)に回収するとき、増加するエネルギーについて考えると、
のとき
に向かうのにエネルギーを、そこからゴミを回収して原点に帰るのにエネルギーを消費します。合計で
消費します。のとき
から帰るときの消費エネルギーは、以下までの計算である程度計算されています。
ので、足りない分を追加してあげる必要があります。
は、が1増えるとだけ増加します。今、以下でまで計算されているので、にするためにだけ増加させます。ということで、増加エネルギーは
となります。
ということで、上記の式を用いて計算することで、個のゴミを1度に回収する場合の消費エネルギーを求めることができるようになりました。
さて、個のゴミの決め方、および回回収するなかでのゴミの個数の振り分け方を考えます。
先ほどの式を見るとわかるように、の個数が多いほど、消費エネルギーを計算する回数が増えるので、それだけ消費エネルギーが増加してしまいます。なので、1回あたりの回収する個数はできるだけ少なくしたいです。ということで、平均的にする必要があります。
また、距離が遠いほど、消費エネルギーはもちろん多くなります。なので、ここにかかる係数(具体的には、もしくはです)を小さくしたいです。なので、遠いゴミは、同時に拾うのをできるだけ避けたいです。
ということで、
できるだけ1回あたりに拾う個数を平均的に
遠いゴミを同時に回収することを避ける
とすると、次のように回収することになります。
番目 のゴミは、回回収するなかでそれぞれ1番目(手元にゴミがない状態のとき)に回収
番目のゴミは、それぞれ2番目(手元にゴミが1個の状態のとき)に回収
と続いていきます。端数が発生した場合、とくに気にせず足していきます(その端数分で1つのくくりにします)。
つまり、ゴミを遠い方から順番に個ずつ選び、そのまとまりごとに1番目に回収、2番目に回収、としていくと、を固定したときの最適解となります。
これをもとにして、上で述べたようなおよびの式に当てはめていくのですが、の部分を、番目に回収するゴミをまとめて一気に処理する方法があります。累積和です。
番目までのの総和
とすると、
たとえば1番目に回収、すなわちの式に当てはめるものは、~についてのなので、
となります。これをの部分に代入してあげれば、まとめて処理できます。
あとは、これを計算していった結果と、の和を求めれば、を決め打ちしたときの最適解になります。
となります(は2以上です)。
あとは、について全探索して、最小値を求めれば、答えが求まります。