AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC085-C Otoshidama

■■■問題■■■

日本でよく使われる紙幣は、10000円札、5000円札、1000円札です。
以下、「お札」とはこれらのみを指します。

青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札がN枚入っていて、
合計でY円だったそうですが、嘘かもしれません。

このような状況がありうるか判定し、
ありうる場合はお年玉袋の中身の候補を一つ見つけてください。
なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。

■■■入力■■■

N Y

●1 <= N <= 2000
●1000 <= Y <= 2000万
●Nは整数である
●Yは1000の倍数である

■■■出力■■■

N枚のお札の合計金額がY円となることがありえない場合は、-1 -1 -1 と出力せよ。

N枚のお札の合計金額がY円となることがありうる場合は、
そのようなN枚のお札の組み合わせの一例を「10000円札x枚、5000円札y枚、1000円札z枚」として、
x、y、z を空白で区切って出力せよ。
複数の可能性が考えられるときは、そのうちどれを出力してもよい。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("9 45000");
            //4 0 5
            //お年玉袋に10000円札4枚と1000円札5枚が入っていれば、
            //合計枚数が9枚、合計金額が45000円になります。
            //5000円札9枚という可能性も考えられるため、0 9 0 も正しい出力です。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("20 196000");
            //-1 -1 -1
            //合計枚数が20枚の場合、
            //すべてが10000円札であれば合計金額は200000円になり、
            //そうでなければ195000円以下になるため、196000円という合計金額はありえません。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1000 1234000");
            //14 27 959
            //この他にも多くの候補があります。
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("2000 20000000");
            //2000 0 0
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        long[] wkArr = InputList[0].Split(' ').Select(X => long.Parse(X)).ToArray();
        long N = wkArr[0];
        long Y = wkArr[1];

        for (long I = 0; I <= N; I++) {
            long SumVal = 10000 * I;
            if (SumVal > Y) break;
            for (long J = 0; I + J <= N; J++) {
                SumVal = 10000 * I + 5000 * J;
                long Rest = Y - SumVal;

                if (Rest < 0) break;
                if (Rest % 1000 > 0) continue;
                long K = Rest / 1000;

                if (I + J + K == N) {
                    Console.WriteLine("{0} {1} {2}", I, J, K);
                    return;
                }
            }
        }
        Console.WriteLine("-1 -1 -1");
    }
}


解説

計算量削減のため、2重ループで解いてます。