ABC #013 C – 節制
問題の概要
日の間、初期値 の満腹度を以下にさせないために、以下のような食事のいずれかを選ぶ。
内容 | 食費 | 満腹度の変動 |
---|---|---|
普通の食事 | ||
質素な食事 | ||
食事抜き |
以上の条件を満たす必要最低限の食費はいくらかを求める。 また、満腹度には上限がない上、の値の範囲で以下のように部分点が設定されている。
範囲 | ||||
---|---|---|---|---|
点数 | 10 | 40 | 100 | 101 |
問題の考察
普通の食事の日数を日、質素な食事の日数を日とする。
この時、満腹度には上限がないため、最初の日に全ての食事を済ますと考える。 この方法では、満腹度が途中でになる状態を考えずに、食費の最小値を求めることができる。
解答例
[100点解法] に対する全探索
各 に対して、以下の不等式が成り立つかどうかを確認する。
しかし、この解放ではであるため、のテストケースでは時間が足りない。
[満点解法] のみの全探索
式 (1) を以下のように式変形するとのみの探索で済むため、 で求めれる。
また、の値が大きいとき、の値が負の値をとることがあるため、注意が必要となる。
[満点解法] 尺取り法を用いた解法
この解法では、式 (1) をそのまま用いる。 の探索を、以下のように尺取り法を用いることで、で探索することを可能とした。
- 最初に、普通の食事だけで乗り切る場合の最低回数を求める。これをとする。
- 式(1)を満たさなくなるまで、を減少させる。
- 式(1)を満たすまで、質素な食事の回数を増加させる。
- 操作2, 3ができなくなるまで繰り返す。
以上のソースコードは以下のGithub上にて参照可能です。 github.com