E8本(数学)    次のE8本(数学)の問題へ    前のE8本(数学)の問題へ

E8本(数学) 022 Choose Cards 3


問題へのリンク


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("6");
            WillReturn.Add("40000 50000 20000 80000 50000 30000");
            //2
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        var CntDict = new Dictionary<long, long>();
        foreach (long EachA in AArr) {
            if (CntDict.ContainsKey(EachA) == false) {
                CntDict[EachA] = 0;
            }
            CntDict[EachA]++;
        }

        long Answer = 0;
        foreach (var EachPair in CntDict) {
            long PairVal = 100000 - EachPair.Key;
            if (PairVal < EachPair.Key) continue;
            if (PairVal == EachPair.Key) {
                if (EachPair.Value >= 2) {
                    Answer += EachPair.Value * (EachPair.Value - 1) / 2;
                }
            }
            else {
                if (CntDict.ContainsKey(PairVal)) {
                    long PairCnt = CntDict[PairVal];
                    Answer += EachPair.Value * CntDict[PairVal];
                }
            }
        }
        Console.WriteLine(Answer);
    }
}


解説

値ごとの度数分布表を求めてから、
ペアの値ごとに解を計上してます。