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

ABC017-C ハイスコア


問題へのリンク


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 6");
            WillReturn.Add("1 3 30");
            WillReturn.Add("2 3 40");
            WillReturn.Add("3 6 25");
            WillReturn.Add("6 6 10");
            //80
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2 7");
            WillReturn.Add("1 3 90");
            WillReturn.Add("5 7 90");
            //180
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1 4");
            WillReturn.Add("1 4 70");
            //0
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct LRSInfoDef
    {
        internal int Left;
        internal int Right;
        internal int Score;
    }

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

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

        SplitAct(InputList[0]);
        int M = wkArr[1];
        int UB = M;

        var LRSInfoList = new List<LRSInfoDef>();
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            LRSInfoDef WillAdd;
            WillAdd.Left = wkArr[0];
            WillAdd.Right = wkArr[1];
            WillAdd.Score = wkArr[2];
            LRSInfoList.Add(WillAdd);
        }

        // いもす法
        long[] SumArr = new long[UB + 1];
        foreach (LRSInfoDef EachLRSInfo in LRSInfoList) {
            SumArr[EachLRSInfo.Left] += EachLRSInfo.Score;
            if (EachLRSInfo.Right + 1 <= UB) {
                SumArr[EachLRSInfo.Right + 1] -= EachLRSInfo.Score;
            }
        }
        for (int I = 1; I <= UB; I++) {
            SumArr[I] += SumArr[I - 1];
        }

        // 全部のスコア合計
        long ScoreAllSum = LRSInfoList.Sum(pX => pX.Score);

        // 取得しない宝石を全探索
        long Answer = long.MinValue;
        for (int I = 1; I <= UB; I++) {
            long AnswerKouho = ScoreAllSum - SumArr[I];
            Answer = Math.Max(Answer, AnswerKouho);
        }
        Console.WriteLine(Answer);
    }
}


解説

取らない宝石を全探索してます。

取らない宝石を決めた時のスコアは、
全部の遺跡のスコアの合計から、その宝石を含む遺跡のスコアの合計を
引いたものなので、

宝石ごとの遺跡のスコアを、いもす法で最初に求めてます。