第二回 アルゴリズム実技検定 M - 食堂
問題
ある食堂では日目、日目、日目に料理が提供される。 社員それぞれについて、以下の条件で食堂に通うとき、回目に利用するまでに料理を食べる回数を求める。
- 初めて食堂を利用する日は日目である。
- 初めて食堂を利用して以降、料理が提供される日は必ず食堂を利用する。
- 初めて食堂を利用して以降、前回の利用から日経過しているなら利用する。
考察
各社員について、自分の好きな料理以外はどれも同じとみなすので料理ごとに独立に問題を解くことができる。以下、料理と好きな料理がの社員について解く
料理が提供される日の集合[tex: \mathcal{D}x]は、 [tex: \mathcal{D}x \triangleq \{ d | d]日目に提供される料理が
のとき、解は0。以下、そうでない場合を考える。
解がかなり大きくなる可能性があり、また、メニューを食べる回数を決めて二分探索するのも難しい。この問題はダブリングを用いて解く。次のようなDPを考える
- の回後にメニューを食べるまでに全てのメニューを食べる回数
- の回後にメニューを食べる日
と定義する。
- (ただし)
で更新する。
以下、社員についての解を求める。
まず、最初に料理を食べる日までを減らす。 その後、その日から回食べるまでに全てのメニューを食べる回数が、残り日数を超えないか判定しながら、料理を食べる回数をカウントする。