トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.32 貯金箱の憂鬱

■■■問題■■■

太郎君はいつも小銭を貯金していて、硬貨を貯金箱に入れています。
貯金箱の中身がある程度たまったので、
太郎君は銀行に行って両替をしてもらうことにしました。

太郎君の国では通貨として1000円札の紙幣と、100円、25円、1円の硬貨があります。
それ以外の金額の紙幣や硬貨はありません。

両替は、
・1円硬貨25枚で25円硬貨1枚に
・25円硬貨4枚で100円硬貨1枚に
・100円硬貨10枚で1000円札1枚に
それぞれ替えることができます。

入力に、貯金箱の中身としてそれぞれの硬貨の枚数が与えられるので、
硬貨の枚数が最も少なくなるように両替したとき、
最終的に太郎君が所持する硬貨の合計枚数を出力してください。

両替は手数料無く何度でもすることができます。
また、両替の前後で総額が変化してはいけません。

■■■入力■■■

L
M
N

1行目に、100円硬貨の枚数を表す整数 L(0 <= L <= 1000) が与えられます。
2行目に、 25円硬貨の枚数を表す整数 M(0 <= M <= 1000) が与えられます。
3行目に、  1円硬貨の枚数を表す整数 N(0 <= N <= 1000) が与えられます。

■■■出力■■■

硬貨の合計枚数を出力してください。
最後に改行してください。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input3";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("7");
            WillReturn.Add("20");
            WillReturn.Add("10");
            //12
            //25円硬貨20枚を100円硬貨5枚に両替し、
            //さらに100円硬貨10枚を1000円札に両替するのが最も少なくなります。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("0");
            WillReturn.Add("0");
            WillReturn.Add("0");
            //0
            //貯金箱は空っぽでした
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int L = int.Parse(InputList[0]);
        int M = int.Parse(InputList[1]);
        int N = int.Parse(InputList[2]);

        int SumMoney = L * 100 + 25 * M + N;

        int CoinCnt = 0;
        SumMoney %= 1000;
        CoinCnt += SumMoney / 100; SumMoney %= 100;
        CoinCnt += SumMoney / 25; SumMoney %= 25;
        CoinCnt += SumMoney;
        Console.WriteLine(CoinCnt);
    }
}


解説

貪欲法のアルゴリズムを使ってます。
最強最速アルゴリズマー養成講座: そのアルゴリズム、貪欲につき