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

ABC052-D Walk and Teleport


問題へのリンク


C#のソース

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

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("4 2 5");
            WillReturn.Add("1 2 5 7");
            //11
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("7 1 100");
            WillReturn.Add("40 43 45 105 108 115 124");
            //84
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("7 1 2");
            WillReturn.Add("24 35 40 68 72 99 103");
            //12
        }
        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(pX => long.Parse(pX)).ToArray();
        long A = wkArr[1];
        long B = wkArr[2];

        long[] XArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();

        long Answer = 0;
        for (int I = 1; I <= XArr.GetUpperBound(0); I++) {
            long Kouho1 = (XArr[I] - XArr[I - 1]) * A;
            long Kouho2 = B;
            Answer += Math.Min(Kouho1, Kouho2);
        }
        Console.WriteLine(Answer);
    }
}


解説

1-2-3
という小さいケースで考察すると

1,3,2の順に訪問する場合は、
1から3にテレポートしてから
3から2に徒歩が考えられますが、
これは、1から2にテレポートして、
2から3に移動するのと同じコストです。

結局のところ、
小さい番号から順に訪問すれば良く、
それぞれの移動で徒歩とテレポートの
コストが小さい方を選択すれば解になります。