Official

B - 穴の開いた硬貨 / Perforated Coin Editorial by KoD


\(i\) 番目の客にはお釣りとして \(B_i - A_i\) 円支払います。これを硬貨の枚数が最小になるように支払うためには、額の大きい硬貨から順に使えるだけ使っていくのが最適です。たとえば、お釣りとして \(417\) 円支払うとき、\(100\) 円玉を \(4\) 枚、\(10\) 円玉を \(1\) 枚、\(5\) 円玉を \(1\) 枚、\(1\) 円玉 \(2\) 枚使うのが最適です。

上記の事実から、お釣りに使う硬貨を決定することができるので、使用する \(5\) 円玉および \(50\) 円玉の枚数を求めることができます。

実装例 (C++) :

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

int main() {
    int N;
    cin >> N;
    int ans = 0;
    while (N--) {
        int a, b;
        cin >> a >> b;
        int x = b - a;
        for (int y : {500, 100, 50, 10, 5, 1}) {
            if (y == 50 or y == 5) {
                ans += x / y;
            }
            x %= y;
        }
    }
    cout << ans << '\n';
}

posted:
last update: