Problem:
有料道路通行料

20XX年に喜多方市熱塩加納町から南会津町までの6区間、総距離58kmの会津中央道路が完成し開通する予定です。

開通後、半年間は利用促進のため17時30分〜19時30分までに出発ICか到着ICを通過し、なおかつ走行距離が40km以下の車に対する通行料金は半額になります。ただし料金は50円単位とし、端数は切り上げます。下記の表は料金と距離の一覧表です。

例えば喜多方（２）から会津若松（４）までは料金が450円、距離が12kmとなります。半額時間帯であれば250円になります。

出発IC、出発IC通過時刻、到着IC、到着IC通過時刻を入力とし、料金を計算して出力するプログラムを作成してください。ただし、入力される時刻は24 時間表記の値とします。なお、17時30分および19時30分ちょうどに通過した場合も半額時間帯に含めます。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

d
hd md
a
ha ma

１行目に出発ICの番号 d (1 ≤ d ≤ 7)、２行目に出発ICの通過時刻の時間 hd (0 ≤ hd ≤ 23) と分 md (0 ≤ md ≤ 59) が与えられます。

3行目に到着ICの番号 a (1 ≤ a ≤ 7)、４行目に到着ICの通過時刻の時間 ha (0 ≤ ha ≤ 23) と分 ma (0 ≤ ma ≤ 59) が与えられます。

Output

データセットごとに通行料金（整数）を１行に出力します。

Sample Input

2
17 25
4
17 45
4
17 25
7
19 35
0

Output for the Sample Input

250
1300

Solution in C# (judge verdict: Accepted)

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

namespace _0163
{
    public class Program

    {
        public static int[,] tolls = new int[,]
        {
              {  0, 300, 500, 600, 700, 1350, 1650 }
            , {  6,   0, 350, 450, 600, 1150, 1500 }
            , { 13,   7,   0, 250, 400, 1000, 1350 }
            , { 18,  12,   5,   0, 250,  850, 1300 }
            , { 23,  17,  10,   5,   0,  600, 1150 }
            , { 43,  37,  30,  25,  20,    0,  500 }
            , { 58,  52,  45,  40,  35,   15,    0 }
        };

        const int D_START = 1050;
        const int D_END = 1170;
        const int D_DIST = 40;

        public static void Main(string[] args)
        {
            while (true)
            {
                int d = RInt() - 1; if (d == -1) break;
                int mD = GetMinute(RIntAr());
                int a = RInt() - 1;
                int mA = GetMinute(RIntAr());

                int from = Math.Min(d, a);
                int to = Math.Max(d, a);
                int toll = tolls[from, to];

                bool discountD = tolls[to, from] <= D_DIST ? true : false;
                bool discountT = (D_START <= mD && mD <= D_END) || (D_START <= mA && mA <= D_END) ? true : false;
                Console.WriteLine(discountD && discountT ? GetHalf(toll) : toll);
            }

        }

        private static int GetHalf(int toll)
        {
            int half = toll / 2;
            if (half % 50 == 0) return half;
            else return((half / 50) + 1) * 50;
        }

        private static int GetMinute(int[] v) { return v[0] * 60 + v[1]; }

        static string RSt() { return Console.ReadLine(); }
        static int RInt() { return int.Parse(Console.ReadLine().Trim()); }
        static long RLong() { return long.Parse(Console.ReadLine().Trim()); }
        static double RDouble() { return double.Parse(Console.ReadLine()); }
        static string[] RStAr(char sep = ' ') { return Console.ReadLine().Trim().Split(sep); }
        static int[] RIntAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => int.Parse(e)); }
        static long[] RLongAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => long.Parse(e)); }
        static double[] RDoubleAr(char sep = ' ') { return Array.ConvertAll(Console.ReadLine().Trim().Split(sep), e => double.Parse(e)); }
        static string WAr<T>(IEnumerable<T> array, string sep = " ") { return string.Join(sep, array.Select(x => x.ToString()).ToArray()); }
    }

}