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

AGC-010-A Addition

■■■問題■■■

黒板にN個の整数が書かれています。i番目の整数はAiです。
これらの数に対して、高橋君は以下の操作を繰り返します。

●偶奇が等しい2つの数 Ai,Ajを一組選び、それらを黒板から消す。
●その後、二つの数の和 Ai+Aj を黒板に書く。

最終的に黒板に数が1つだけ残るようにできるかどうか判定して下さい。

■■■入力■■■

N
A1 A2 ・・・ AN

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

■■■出力■■■

黒板に数1つだけ残るようにできるならYESを、そうでないならNOを出力せよ。


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("1 2 3");
            //YES
            //以下のようにすれば、数を1つだけ残すことができます。
            //●黒板から1と3を消し、4を書く。このとき、残る数は(2,4)である
            //●黒板から2と4を消し、6を書く。このとき、残る数は6だけである
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("5");
            WillReturn.Add("1 2 3 4 5");
            //NO
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        int OddCnt = wkArr.Count(X => X % 2 == 1);

        //奇数の個数が2の倍数ならOK
        Console.WriteLine(OddCnt % 2 == 0 ? "YES" : "NO");
    }
}


解説

偶数 + 偶数 = 偶数
奇数 + 奇数 = 偶数
ですので、

1個以上の偶数は、1個の偶数にできます。

奇数は、2の倍数個あれば、偶数のみにできて
2の倍数個でなければ、1個の偶数と1個の奇数にしかできません。

以上をふまえて、奇数の個数が2の倍数かを判定してます。