見出し画像

C - 節制

[Q] https://atcoder.jp/contests/abc013/tasks/abc013_3

1. はじめに食べれるだけ食べちゃって、終了日ぎりぎりまで絶食すればいい。
2. どれだけ食べるかは、普通の食事を0 ~ N回全探索する。
3. 普通回数が決まれば、質素回数と食事抜き回数は、O(1)で求まる。
4. 普通以外を全部食事抜きとした場合に、不足する満腹度が出る。質素におきかえれば、質素 + 食事抜きの減少分が増加量。

Q. 例1
4 5
100 4 60 1 4

1.) 普通 0 回
・残りの日数
leftday = 4 - 0 = 4
・今の満腹度
energy = 5 + 4 * 0 = 5
・足りない満腹度
lack = leftday * E - energy = 4 * 4 - 5 = 11
・何日質素にすればいいか。
d = lack / (D + E) + 1 = 11 / 5 + 1 = 3 日

DDDE の4日を過ごせる。
ans = 100 * 0 + 60 * 3 = 180 が候補

2.) 普通 1 回
・残りの日数
leftday = 4 - 1 = 3
・今の満腹度
energy = 5 + 4 * 1 = 9
・足りない満腹度
lack = leftday * E - energy = 3 * 4 - 9 = 3
・何日質素にすればいいか。
d = lack / (D + E) + 1 = 3 / 5 + 1 = 1 日

BDEE の4日を過ごせる。
ans = 100 * 1 + 60 * 1 = 160 が候補

答えは160

実装

int main(){
 cincout();
 
 ll N, H, A, B, C, D, E;
 cin >> N >> H >> A >> B >> C >> D >> E;
 
 ll ans = oo;
 ll dif = D+E; // Dをくったときの増加量
 rep(b, N+1){ // Bの日数
   ll leftday = N-b;
   ll energy = H+B*b;
   ll lack = leftday * E - energy;
   ll d=0; // Dの日数
   if (lack>=0){
     d = lack/dif + 1;
   }
   ll score = A*b + C*d;
   chmin(ans, score);
 }
 cout << ans << endl;
}

https://atcoder.jp/contests/abc013/submissions/27464034


この記事が気に入ったらサポートをしてみませんか?