AGC027 B問題 : Garbage Collector
問題. Garbage Collector
数直線上に 個 のゴミが左から順番に の場所にある.ゴミ箱は原点にあり,すべてのゴミを捨てたい.各動作についてコストがかかり,1つのゴミを拾うのに ,いくつかのゴミを捨てるのに ,ゴミを 個持っているときに1移動するのに .ただし,拾ったゴミをゴミ箱以外に置くことはできない.すべてのゴミを捨てるのにかかる最小のコストを求めよ.
制約: , ,
解法. 上手くやると調和級数が見えてくる
解説 [1] を参考にした.解説が分かりやすいのでここでは雑にまとめる.
動作が3つ(拾う,捨てる,移動する)ある.拾うはどのゴミのまとめ方でも,各ゴミに対して1回しか行われないので,どの最終のコストに対しても だけ加算される.したがって,どのようにゴミを拾って移動するのかの戦略を考えることが重要である.
まず,拾い方であるが 個のゴミ があるときに,各ゴミに対して行きに拾うか,帰りに拾うかの2通りが考えられる.しかし,移動コストは持っているゴミの量で増加するので明らかに帰りに拾う方が最終コストが悪くならない.よって,原点から出発して, の順番にゴミを拾いながら帰るのが最適な戦略である.
次に,この戦略でかかるコストを考える.まず,捨てるのは1回だけ行われるのでコスト である.次に,移動コストを考える.まず,原点から に移動するときのコストは であり, から に を持ちながら移動するのでコストは である.同様に考えると移動コストは,
となる.すなわち,後ろから何番目に拾うかで距離の係数が大きくなる.この性質に着目すると戦略が見えてくる(はず).ここで,1回に捨てる 個のゴミは必ずしも連続しているとは限らないことに注意である(反例が でも作れる).
回に分けてゴミを回収することを考える.このとき, 回捨てるので捨てるコストは である.ここで考える必要があるのは, 個のゴミを何回目に回収するかを決めることである.すなわち, 個のゴミを 個の集合に分割する方法でコストが最小となるものを考える必要がある.分割をひとつ決めると上のようにして各分割の移動コストが求まる.この方法を愚直に計算すると となるので分割の方法を上手く考える必要があるが,ここで先程の性質を利用すると高速に計算できる.まず,分割の異なる集合に属するゴミ で, は後ろから 番目, は後ろから 番目に位置するものを考える.ただし, とする.分割のコストの各ゴミの位置の項はちょうど1回しか表れず,その係数はそのゴミが属する集合で後ろから何番目に位置するかで決まるので, と の係数はそれぞれ と である.ただし,一番後ろのゴミの係数は 5 とする.ここで,分割のコストのこれらのゴミの項は となる.ここで, と の属する集合を互いに入れ替えると,他のゴミの項の係数は同じで, だけが異なり,交換後の分割のコストは悪くならない.よって,後ろのゴミから順番に 番目の集合に属するように分割を行うのが最適な戦略となる.回収する順番が同じゴミは連続しており係数が同じなのでまとめることができる.
例えば, で のとき,最適な分割のコストは,
となる,各ゴミの位置の累積和を前処理で で計算すると, 回の加算で求めることができる.全体の計算時間は調和級数で となる.
この問題はlong long型で計算しても途中でオーバーフローする恐れがあるので,上の分割のコストの計算で が大きい順に計算して,分割の計算の途中で現在の最良値よりも悪くなるなら打ち切るということをしている.
計算時間:
まとめ
解けなかったけど良い感じのところまで考察できたので成長できてるかも.
から にするので調和級数を用いたのは初かも.めでたいめでたい.
ただ,long long型でもオーバーフローは怖いな怖いな.