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

ABC331-E Set Meal


問題へのリンク


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("2 3 3");
            WillReturn.Add("2 1");
            WillReturn.Add("10 30 20");
            WillReturn.Add("1 2");
            WillReturn.Add("2 1");
            WillReturn.Add("2 3");
            //31
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2 1 0");
            WillReturn.Add("1000000000 1");
            WillReturn.Add("1000000000");
            //2000000000
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("10 10 10");
            WillReturn.Add("47718 21994 74148 76721 98917 73766 29598 59035 69293 29127");
            WillReturn.Add("7017 46004 16086 62644 74928 57404 32168 45794 19493 71590");
            WillReturn.Add("1 3");
            WillReturn.Add("2 6");
            WillReturn.Add("4 5");
            WillReturn.Add("5 4");
            WillReturn.Add("5 5");
            WillReturn.Add("5 6");
            WillReturn.Add("5 7");
            WillReturn.Add("5 8");
            WillReturn.Add("5 10");
            WillReturn.Add("7 3");
            //149076
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int[] AArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
        int[] BArr = InputList[2].Split(' ').Select(pX => int.Parse(pX)).ToArray();

        int[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();

        var NGSet = new HashSet<long>();
        foreach (string EachStr in InputList.Skip(3)) {
            SplitAct(EachStr);
            long C = wkArr[0] - 1;
            long D = wkArr[1] - 1;
            NGSet.Add(GetHash(C, D));
        }

        var BDict = new Dictionary<int, int>();
        for (int I = 0; I <= BArr.GetUpperBound(0); I++) {
            BDict[I] = BArr[I];
        }

        var BDictSorted = new Dictionary<int, int>();
        foreach (var EachPair in BDict.OrderByDescending(pX => pX.Value)) {
            BDictSorted[EachPair.Key] = EachPair.Value;
        }

        var AnswerList = new List<int>();
        for (long I = 0; I <= AArr.GetUpperBound(0); I++) {
            foreach (var EachPair in BDictSorted) {
                long CurrPair = GetHash(I, EachPair.Key);
                if (NGSet.Contains(CurrPair)) {
                    continue;
                }
                AnswerList.Add(AArr[I] + EachPair.Value);
                break;
            }
        }
        Console.WriteLine(AnswerList.Max());
    }

    // ハッシュ値を返す
    static long GetHash(long pInd1, long pInd2)
    {
        return pInd1 * 1000000000 + pInd2;
    }
}


解説

副菜を値段の降順にソートしておき、
主菜との組み合わせをチェックしてます。

HashSetを使って、高速に照合できるようにしてます。