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

AGC-004-A Divide a Cuboid

■■■問題■■■

1×1×1 のブロックが A×B×C の直方体状に並んでいます。
高橋君は各ブロックを赤色または青色で塗ろうとしています。
このとき、次の条件が成り立つようにします。

●赤いブロックも青いブロックもそれぞれ1個以上ある。
●赤いブロック全体が1つの直方体状になっている。
●青いブロック全体が1つの直方体状になっている。

高橋君は、赤いブロックの個数と青いブロックの個数の差をできるだけ小さくしたいと思っています。
赤いブロックの個数と青いブロックの個数の差の最小値を求めてください。

■■■入力■■■

A B C

2 <= A,B,C <= 10億

■■■出力■■■

赤いブロックの個数と青いブロックの個数の差の最小値を出力せよ。

■■■サンプルケースのイメージ■■■

■入出力例1のイメージ■
例えば、下図のように塗ればよいです。
赤いブロックは9個で、
青いブロックは18個なので、個数の差は9です。



■入出力例2のイメージ■
例えば、下図のように塗ればよいです。
赤いブロックは8個で、
青いブロックも8個なので、個数の差は0です。



■入出力例3のイメージ■
例えば、下図のように塗ればよいです。
赤いブロックは45個で、
青いブロックは30個なので、個数の差は15です。



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 3 3");
            //9
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2 2 4");
            //0
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("5 3 5");
            //15
        }
        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(X => long.Parse(X)).ToArray();
        long A = wkArr[0];
        long B = wkArr[1];
        long C = wkArr[2];

        //偶数の軸がある場合
        if (A % 2 == 0 || B % 2 == 0 || C % 2 == 0) {
            Console.WriteLine(0);
            return;
        }

        //Aで分割する場合
        long wkProd1 = B * C;

        //Bで分割する場合
        long wkProd2 = A * C;

        //Cで分割する場合
        long wkProd3 = A * B;

        long Answer = Math.Min(wkProd1, wkProd2);
        Answer = Math.Min(Answer, wkProd3);
        Console.WriteLine(Answer);
    }
}


解説

こまめに場合分けしてます。