競技プログラミング用 知識集積所

ABC403D - Forbidden Difference

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略

考え方

まず、D=1の場合を考えてみる。

Aの最大値がそこまで大きくないので、各値の出現数カウントが可能なことに注目する。
例えばAが{3,1,4,1,5}であれば、個数のvectorを{0,2,0,1,1,1}と用意できる。
これを、いくつかを0に変更することで0以外の値が連続しないようにする方法を考える。

しかし、これを単純な計算で出すのは難しい。
例えば、{1,3,1,3,1}のように、奇数個の連続でもあえて両端を残さない方がいい場合もある。
また、{3,1,1,3,1,1,3}のように連続する2つを0にしてしまった方がいい場合もある。
そこで、求めるものが最小値である、つまりこれが最適化問題であることを考えて、動的計画法が使えないかと考えてみる。

まず、長さが0である場合、明らかに消す最小個数は0である。
長さが1である場合、例えば{3}であれば、1番目を消すなら最小値は3、消さないなら最小値は0である。
長さが2である場合、例えば{3,1}であれば、2番目を消すなら最小値は1、消さないなら最小値は3である。
というのは2番目を消さない場合は1番目を消す選択しか取れないため。
以下繰り返すと、{3,1,1,3,1,1,3}の場合、
3 1 1 3 1 1 3
消す場合 0 3 1 2 4 3 4 6 1つ前の少ない方+その数
消さない場合 0 0 3 1 2 4 3 4 1つ前の消さない場合と同じ
となり、最小値は6と4のうち小さいほうである4であるとわかる。

以上がD=1の場合の解法である。

次にD>=2の場合。
これは、連続ではなくD個離れた位置に1以上の数があってはいけないことになるが、結局それはD個おきに値を取り出してD=1のときの解法を実行するのと同じである。
よって、forループで各余りについての処理をD回繰り返せばよい。

最後に、D=0の場合。
これは値の重複が許されないという全く別の問題になる。
setか何かを使えばすぐだが、そもそもD=0の場合の特殊対応が必要だと気が付くのが難しい。

解答例


注意点

入力制限をよく見る

考え方のところにもある通り、D=0は特殊対応が必要である。
見落とさないように注意。

別解

タグ:

動的計画法
ウィキ募集バナー