ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

AtCoder Beginner Contest 123 B - Five Dishes

研究室のレイアウト変更で腕が筋肉痛、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc123)にて開催されました、AtCoder Beginner Contest 123 B問題「B - Five Dishes」の問題と僕との戦闘記です。

0.はじめに

今回も、プログラミング言語C#を使用しています。

1.問題文

AtCoder 料理店では、以下の 5 つの料理が提供されています。ここで、「調理時間」は料理を注文してから客に届くまでの時間とします。

  • ABC 丼: 調理時間 A 分
  • ARC カレー: 調理時間 B 分
  • AGC パスタ: 調理時間 C 分
  • APC ラーメン: 調理時間 D 分
  • ATC ハンバーグ: 調理時間 E 分

また、この店には以下のような「注文のルール」があります。

  • 注文は、 10 の倍数の時刻 (時刻 0 , 10 , 20 , 30 , . . . ) にしかできない。
  • 一回の注文につき一つの料理しか注文できない。
  • ある料理を注文したら、それが届くまで別の注文ができない。ただし、料理が届いたちょうどの時刻には注文ができる。

E869120 君は時刻 0 に料理店に着きました。彼は 5 つの料理全てを注文します。最後の料理が届く最も早い時刻を求めてください。 ただし、料理を注文する順番は自由であり、時刻 0 に注文することも可能とであるとします。

最後の料理が届く最も早い時刻を整数で出力せよ。

2.入力例

  • 入力
101
86
119
108
57
  • 出力
481

3.初見の感想

  • 最も時間ロスが大きい注文は最後に注文することで時間が節約できる

→時間のロスは(10-(調理時間の1の位の値))で計算できる

  • 最後の注文以外の注文時間は1の位繰り上げの値となる

4.コードの簡単な解説

  • 入力の値のパースを行い、時間ロス計算と1の位切り上げを行う
        int min = 10;
        string input = Console.ReadLine();
        int a = int.Parse(input);
        if (a % 10 != 0 && a % 10 < min) { min = a % 10; }
        if (a % 10 != 0) { a += (10 - (a % 10)); }
  • 最後の注文の切り上げ分を最終結果からマイナスしておく
        Console.WriteLine(a+b+c+d+e+min-10);

5.全コード

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

class Program
{
    static void Main(string[] args)
    {
        int min = 10;
        string input = Console.ReadLine();
        int a = int.Parse(input);
        if (a % 10 != 0 && a % 10 < min) { min = a % 10; }
        if (a % 10 != 0) { a += (10 - (a % 10)); }
        input = Console.ReadLine();
        int b = int.Parse(input);
        if (b % 10 != 0 && b % 10 < min) { min = b % 10; }
        if (b % 10 != 0) { b += (10 - (b % 10)); }
        input = Console.ReadLine();
        int c = int.Parse(input);
        if (c % 10 != 0 && c % 10 < min) { min = c % 10; }
        if (c % 10 != 0) { c += (10 - (c % 10)); }
        input = Console.ReadLine();
        int d = int.Parse(input);
        if (d % 10 != 0 && d % 10 < min) { min = d % 10; }
        if (d % 10 != 0) { d += (10 - (d % 10)); }
        input = Console.ReadLine();
        int e = int.Parse(input);
        if (e % 10 != 0 && e % 10 < min) { min = e % 10; }
        if (e % 10 != 0) { e += (10 - (e % 10)); }
        Console.WriteLine(a+b+c+d+e+min-10);
    }
}

6.最後に

全探索するような手法もあるみたいですね…

本番中にこの手法を思いついてよかったです!