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

No.156 キャンディー・ボックス

■■■問題■■■

キャンディーが入っている箱がN個ある。
i番目の箱にはCi個のキャンディーが入っている。
A君は、その時の最もキャンディーの少ない箱から1つキャンディーを取っていく。
これを合計M個のキャンディーを取り終えるまで繰り返す。

M個のキャンディーを取り出した時に、空になった箱の数はいくつか?

■■■入力■■■

N M
C1 C2 ・・・ CN

1 <= N  <=  10
1 <= M  <= 100万
1 <= Ci <=  10万
Mは最初のキャンディーの総数以下の数字が与えられる。

■■■出力■■■

M個のキャンディーを取ったあとに空になった箱の数を1行で答えよ。
最後に改行を忘れずに。


C#のソース

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

class Program
{
    static string InputPattern = "Input5";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("3 2");
            WillReturn.Add("1 2 3");
            //1
            //キャンディーの箱が3つある。
            //1つ目の箱にはキャンディーが1つ。
            //2つめの箱にはキャンディーが2つ。
            //3つめの箱にはキャンディーが3つ。
            //A君はこれから合計2つのキャンディーを取る。
            //A君はまず1つのキャンディーが入った箱からキャンディーを1つ取る。
            //次に、キャンディーが2つ入った箱からキャンディーを1つ取る。
            //1つ目の箱にはキャンディーが0つ。
            //2つめの箱にはキャンディーが1つ。
            //3つめの箱にはキャンディーが3つ。
            //最後に残った空のキャンディーの箱の数は1個である。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3 2");
            WillReturn.Add("1 1 3");
            //2
            //キャンディーの箱が3つある。
            //1つ目の箱にはキャンディーが1つ。
            //2つめの箱にはキャンディーが1つ。
            //3つめの箱にはキャンディーが3つ。
            //A君はこれから合計2つのキャンディーを取る。
            //A君はまず1つのキャンディーが入った箱からキャンディーを1つ取る。
            //次に、もう1つのキャンディーが1つ入った箱からキャンディーを1つ取る。
            //1つ目の箱にはキャンディーが0つ。
            //2つめの箱にはキャンディーが0つ。
            //3つめの箱にはキャンディーが3つ。
            //最後に残った空のキャンディーの箱の数は2個である。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("4 10");
            WillReturn.Add("3 2 4 1");
            //4
            //すべての箱が空になる
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("6 257109");
            WillReturn.Add("53771 46578 31908 80435 62678 4327");
            //5
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int M = InputList[0].Split(' ').Select(X => int.Parse(X)).Last();
        int[] CArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();

        Array.Sort(CArr);

        int TatalCnt = 0;
        for (int I = 0; I <= CArr.GetUpperBound(0); I++) {
            TatalCnt += CArr[I];

            if (TatalCnt > M) {
                Console.WriteLine(I);
                break;
            }
            else if (TatalCnt == M) {
                Console.WriteLine(I + 1);
                break;
            }
        }
    }
}


解説

ナイーブに解いてます。