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

No.112 ややこしい鶴亀算

■■■問題■■■

N匹の動物がいる。
動物たちは1からNまで番号が振られている。
また、動物たちはそれぞれ鶴か亀のいずれかである。
ご存知の通り、鶴の足は2本、亀の足は4本である。

ある日、動物たちは鶴亀算を勉強することにした。
そのためにまず、動物たちは各自で「全員の足の総本数」を集計した。
しかし、うっかり者の動物たちは皆、自分自身の足を数え忘れてしまった。

あなたの仕事は、以上の集計結果から鶴と亀の匹数を求めることである。

■■■入力■■■

N
a1 a2 ・・・ aN

1行目に、動物たちの匹数 N(2 <= N <= 50) が与えられる。
2行目に、i番目の動物が数えた足の総本数aiが空白区切りで与えられる。
aiは問題制約を満たす値である。

■■■出力■■■

鶴と亀の匹数をこの順に空白区切りで出力せよ。
解はちょうど一つ存在することが保証される。
最後に改行してください。


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("2");
            WillReturn.Add("2 4");
            //1 1
            //1番目の動物が亀、2番目の動物が鶴である
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("4 4 4");
            //3 0
            //3匹とも鶴である
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        int S = AArr.Sum() / (AArr.Length - 1);
        int TuruCnt = 0;
        int KameCnt = 0;
        foreach (int EachInt in AArr) {
            if (S - EachInt == 2) TuruCnt++;
            else KameCnt++;
        }
        Console.WriteLine("{0} {1}", TuruCnt, KameCnt);
    }
}


解説

動物が3匹いるとして、足の本数の総和をSとすれば、
a1 = S - 1匹目の動物の足
a2 = S - 2匹目の動物の足
a3 = S - 3匹目の動物の足
となりますので、
右辺の和を求めれば
3S - S
となり、Sを求めることができます。