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

ABC-123-C Five Transportations

■■■問題■■■

AtCoder社は成長し、
2028年になってついに6つの都市 (都市 1,2,3,4,5,6) からなる AtCoder帝国を作りました!

AtCoder帝国には5つの交通機関があります。

●電車:都市1から2まで1分で移動する。1つの電車にはA人まで乗ることができる。
●バス:都市2から3まで1分で移動する。1つのバスにはB人まで乗ることができる。
●タクシー:都市3から4まで1分で移動する。1つのタクシーにはC人まで乗ることができる。
●飛行機:都市4から5まで1分で移動する。1つの飛行機にはD人まで乗ることができる。
●船:都市5から6までを1分で移動する。1つの船にはE人まで乗ることができる。

それぞれの交通機関は、各整数時刻 (0,1,2,3, ・・・ ) に、都市から出発します。
いま、N人のグループが都市1におり、全員都市6まで移動したいです。

全員が都市6に到着するまでに最短で何分かかるでしょうか?
なお、乗り継ぎにかかる時間を考える必要はありません。

■■■入力■■■

N
A
B
C
D
E

●1 <= N,A,B,C,D,E <= 1000兆
●入力は全て整数である

■■■出力■■■

全員が都市6に移動するのに必要な最小の時間を分単位で出力せよ。

■■■サンプルケースのイメージ■■■

■入出力例1のイメージ■
例えば、次のような移動方法が考えられます。
はじめ、次の画像のように、N=5人が都市1にいます。



1分後までに、3人が都市1から都市2に電車で移動します。
ここで、電車は一度に3人までしか運べないことに注意してください。



2分後までに、残り2人が都市1から都市2に電車で移動し、
都市2にいた 3人のうち2人がバスで都市3に移動します。
ここで、バスは一度に2人までしか運べないことに注意してください。



3分後までに、2人が都市2から都市3にバスで移動し、2人が都市3から都市4にタクシーで移動します。



それ以降は、まだ都市6に到着していない人が止まらずに移動し続けると、
全員が7分で都市6に着くことができます。
また、6分以内で全員が都市6に着く方法はありません。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("5");
            WillReturn.Add("3");
            WillReturn.Add("2");
            WillReturn.Add("4");
            WillReturn.Add("3");
            WillReturn.Add("5");
            //7
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("10");
            WillReturn.Add("123");
            WillReturn.Add("123");
            WillReturn.Add("123");
            WillReturn.Add("123");
            WillReturn.Add("123");
            //5
            //どの交通機関も N=10人を1回で運ぶことができます。
            //したがって、全員が止まらずに移動し続ければ5分で都市6に着くことができます。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("10000000007");
            WillReturn.Add("2");
            WillReturn.Add("3");
            WillReturn.Add("5");
            WillReturn.Add("7");
            WillReturn.Add("11");
            //5000000008
            //入力・出力が32ビット整数型に収まらない可能性があることに注意してください。
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        long N = long.Parse(InputList[0]);
        long A = long.Parse(InputList[1]);
        long B = long.Parse(InputList[2]);
        long C = long.Parse(InputList[3]);
        long D = long.Parse(InputList[4]);
        long E = long.Parse(InputList[5]);

        long MinVal = Math.Min(A, B);
        MinVal = Math.Min(MinVal, C);
        MinVal = Math.Min(MinVal, D);
        MinVal = Math.Min(MinVal, E);

        if (MinVal >= N) {
            Console.WriteLine(5);
            return;
        }
        long Syou = N / MinVal;
        long Amari = N % MinVal;
        if (Amari > 0) Syou++;
        Console.WriteLine(5 + Syou - 1);
    }
}


解説

1分待ちの渋滞の有無で場合分けしてます。