C. k-Amazing Numbers
添字と境界条件の扱いがめんどくさい問題。
気づき
- 範囲を全部試すのは無理
- ある値を選んだとき、全体を覆うのに必要な最短の範囲を求めることができる
現れる数字は1からNまでしかないので、順番にどれだけの範囲があれば全体をカバーできるかをもとめて、範囲の長さ1からNまで出力すれば良い。
解法
- 同じ数字が現れるインデックスを求める
- 数字ごとに全体をカバーするのに必要な最小の範囲を求める(一個前(と先頭と終端)のインデックスとの差のmax)
- 同じ範囲の大きさが必要な場合、数字が小さいほうが優先
という処理で B[範囲の大きさ] = 数字 の配列を作って順番に出力すれば良い。
D. Make Them Equal
Cより簡単では疑惑
この手の問題を見たときはまず確認することがあって、
- 不変量に注目する
問題の操作をみると、同じ値を「足して」「引いて」いるから、全体の合計は変わらないことがわかる。
こういった不変量に注目すると問題がみえてくることがある。
今回は、合計がかわらないという条件で全体を等しくするので、それぞれはで等しくなってそれ以外にない。
あとは、「」での操作が最も柔軟性が高いことにきづければ、なるべくインデックス1に移動させてから、それぞれのインデックスに、ずつ分配すれば良いことに気づく。
また、(インデックス1から順番に操作できるとは限らないが)、回あれば、全体をインデックス1に移動できることもわかる。
解法
- sumを配列aの合計とする
- がで割り切れるならに移動する(からを引いて、にを足す)
- がで割り切れないなら、 をインデックスmかインデックス1から移動して加算することで、で割り切れるように調節する(そして2の操作)
- がsum、からが0になる
- から各インデックスへずつ移動する
に集めるのに回、から分配するのに回で、合計回に収まる。