AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC006-C スフィンクスのなぞなぞ


問題へのリンク


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 9");
            //1 1 1
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("7 23");
            //1 3 3
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("10 41");
            //-1 -1 -1
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        long N = wkArr[0];
        long M = wkArr[1];

        // 子供の数でループ
        for (long I = 0; I <= N; I++) {
            long RestFoot = M - 4 * I;
            if (RestFoot < 0) break;
            long RestPeople = N - I;

            // 連立方程式
            // 2A + 3B = RestFoot
            //  A +  B = RestPeople
            // を解く

            long B = RestFoot - 2 * RestPeople;
            if (B < 0) continue;

            long A = RestPeople - B;
            if (A < 0) continue;

            Console.WriteLine("{0} {1} {2}", A, B, I);
            return;
        }
        Console.WriteLine("-1 -1 -1");
    }
}


解説

子供の数を全探索し、
鶴亀算で大人と老人の数を求め、適切な値なら解になります。