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

No.185 和風

■■■問題■■■

諸外国では,○+□=8のように,答えがたくさんある問題があるようですが,採点が大変ですよね.
そこで,やっぱり和風に答えが一意に定まるように条件を加える事としましょう.

おや,条件を加えすぎたかもしれません.
N個の正整数の2つ組 (X1,Y1),(X2,Y2),・・・,(XN,YN) が与えられるので,
□+Xk = Yk , k=1,2,・・・,N
を同時に満たす□に当てはまる正整数を求めてください.

■■■入力■■■

N
X1 Y1
X2 Y2
・・・
XN YN

1 <= N <= 1000
1 <= Xi,Yi <= 100万

■■■出力■■■

□にあてはまる正整数を出力してください。
ただし,存在しないなら,-1を代わりに出力してください.
なお,高度な数学を駆使すると,
□にあてはまる正整数が2つ以上存在することはないことがわかるらしいです.


C#のソース

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

class Program
{
    static string InputPattern = "Input4";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("2");
            WillReturn.Add("3 5");
            WillReturn.Add("7 9");
            //2
            //□に3を足すと5になり,7を足すと9になるってことは,□は2だね
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2");
            WillReturn.Add("3 5");
            WillReturn.Add("7 10");
            //-1
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1");
            WillReturn.Add("8 2");
            //-1
            //正整数しか知らないから,8を足すと2になるようなものなんてわかんないや
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        var SikakuSet = new HashSet<int>();
        foreach (string EachStr in InputList.Skip(1)) {
            int[] wkArr = EachStr.Split(' ').Select(X => int.Parse(X)).ToArray();
            SikakuSet.Add(wkArr[1] - wkArr[0]);
        }

        if (SikakuSet.Count >= 2) { //ユニーク解でなければNG
            Console.WriteLine(-1); return;
        }
        if (SikakuSet.First() <= 0) { //正整数の解でなければNG
            Console.WriteLine(-1); return;
        }
        Console.WriteLine(SikakuSet.First());
    }
}


解説

□の候補をHashSetで管理してます。