けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 予選 2018 A - 鉛筆 (AOJ 0641) (8Q, 難易度 1)

切り上げ処理!

問題概要

鉛筆を  N 本以上買いたい。買うための手段として、次の 2 セットがある。いずれかのセットを選び、選んだセットをいくつか購入することとする。両方のセットを選ぶことはできない。

  • セット X:1 セットあたり  A 本あり、1 セット  B 円である
  • セット Y:1 セットあたり  C 本あり、1 セット  D 円である

 N 本以上の鉛筆を揃えるのに必要な金額の最小値を答えよ。

制約

  •  1 \le N, A, B, C, D \le 1000

考えたこと

セット X について考えよう。なお、セット Y についても同様に考えられる。

さて、買う必要のあるセット数は次のように考えられる。ここで、 N A で割ったときの商を  q とする。

  •  N A で割り切れるとき: q セット
  •  N A で割り切れないとき: q + 1 セット( q セット買った時点で足りないため)

このように、割り切れないときだけ商を 1 増やす処理は切り上げ処理などとも呼ばれる。実は、次のようにワンライナーで書ける。

(N + A - 1) / A

このように書ける理由については、次の記事を参照。

drken1215.hatenablog.com

よって、セット X で  N 本以上の鉛筆を揃えるのに必要な金額は

(N + A - 1) / A * B

と表せる。セット Y も同様である。小さい方を答えればよい。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, A, B, C, D;
    cin >> N >> A >> B >> C >> D;

    int priceX = (N + A - 1) / A * B;
    int priceY = (N + C - 1) / C * D;
    cout << min(priceX, priceY) << endl;
}