ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC068 D - Decrease (Contestant ver.)

問題
提出コード

解法

操作が2種類あって考えづらいので、操作をひとまとめにします。
答えとなる数列の全ての数字にKを足し、1回の操作を行うと、数列の最大値を1つ選びK+1を減らす、というようにすると、K回操作を行った後の状態はもともとの条件と同じ数列になります。
最終的な状態はN-1にしたいので、その状態から逆向きに復元していきます。
このとき、N-K-1にするという条件に変更すれば、最終的に出来上がる数列が上で行ったKを足すという操作を打ち消すことができ、そのまま答えとなります。
ということで、全ての要素がN-K-1N個の数字が並んだ数列について、KK+1増やすという操作を行って元の状態に戻すことを考えると、どこか1つに集中して操作を行うと答えの条件を満たさなくなってしまう(数字が大きくなりすぎるため)ので、
K回の操作はN個の要素に均一になるように割り振ってあげればいいことになります。
あとは、Kが大きい時はNが小さいと条件を満たせなくなりますが、Nを常に最大の50に設定していれば、全てのパターンを網羅できるため、常にN=50と固定してしまって処理を行ってあげます。
ということで、N=50、要素の初期値がすべてN-K-1の数列に、K個の51を、それぞれの要素についてK/50回ずつ割り振ってあげれば答えとなります。端数は、その個数だけ適当に1回操作を追加してあげれば大丈夫です。