トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

ABC-071-C Make a Rectangle

■■■問題■■■

太さが無視できる棒がN本あります。
i番目の棒の長さはAiです。

すぬけ君は、これらの棒から4本の異なる棒を選び、
それらの棒を辺として長方形(正方形を含む)を作りたいです。

作ることができる最大の長方形の面積を求めてください。

■■■入力■■■

N
A1 A2 ・・・ AN

●4 <= N <= 10万
●1 <= Ai <= 10億
●Aiは整数

■■■出力■■■

すぬけ君が作ることのできる最大の長方形の面積を出力せよ。
ただし、長方形を作れない場合は、0を出力せよ。


C#のソース

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

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("6");
            WillReturn.Add("3 1 2 4 2 1");
            //2
            //1×2の長方形を作ることができます
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("4");
            WillReturn.Add("1 2 3 4");
            //0
            //長方形を作ることはできません
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("10");
            WillReturn.Add("3 3 3 3 4 4 4 5 5 5");
            //20
        }
        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(X => long.Parse(X)).ToArray();

        var Query = AArr.GroupBy(A => A).OrderByDescending(A => A.Key);
        var HenList = new List<long>();

        foreach (var EachItem in Query) {
            if (EachItem.Count() >= 4) {
                HenList.Add(EachItem.Key);
                HenList.Add(EachItem.Key);
            }
            else if (EachItem.Count() >= 2) {
                HenList.Add(EachItem.Key);
            }
            if (HenList.Count >= 2) break;
        }

        if (HenList.Count >= 2) {
            Console.WriteLine(HenList[0] * HenList[1]);
        }
        else Console.WriteLine(0);
    }
}


解説

LINQで、棒の長さごとのCountを求めてます。