AtCoderの企業コンテスト    次の企業コンテストの問題へ    前の企業コンテストの問題へ

全国統一プログラミング王決定戦予選 C Different Strokes


問題へのリンク


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("3");
            WillReturn.Add("10 10");
            WillReturn.Add("20 20");
            WillReturn.Add("30 30");
            //20
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("20 10");
            WillReturn.Add("20 20");
            WillReturn.Add("20 30");
            //20
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("6");
            WillReturn.Add("1 1000000000");
            WillReturn.Add("1 1000000000");
            WillReturn.Add("1 1000000000");
            WillReturn.Add("1 1000000000");
            WillReturn.Add("1 1000000000");
            WillReturn.Add("1 1000000000");
            //-2999999997
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct ABInfoDef
    {
        internal int A;
        internal int B;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int N = int.Parse(InputList[0]);

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

        var ABInfoList = new List<ABInfoDef>();
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            ABInfoDef WillAdd;
            WillAdd.A = wkArr[0];
            WillAdd.B = wkArr[1];
            ABInfoList.Add(WillAdd);
        }

        ABInfoList = ABInfoList.OrderByDescending(pX => pX.A + pX.B).ToList();

        long SumTakahashi = 0;
        long SumAoki = 0;
        for (int I = 0; I <= ABInfoList.Count - 1; I++) {
            if (I % 2 == 0) SumTakahashi += ABInfoList[I].A;
            if (I % 2 == 1) SumAoki += ABInfoList[I].B;
        }

        Console.WriteLine(SumTakahashi - SumAoki);
    }
}


解説

皿が2枚しかない場合で下記のようなケースを考えると
先手は、A+Bの和が大きい皿を選ぶのが最適と分かります。

1 9
2 3

後手も先手と条件は同じなので、A+Bの和が大きい皿を選ぶのが最適と分かります。

皿の枚数が増えても、同様なので、
順にシュミレーションして解いてます。