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

AGC-008-A Simple Calculator

■■■問題■■■

すぬけ君は電卓を持っています。 この電卓にはディスプレイと2個のボタンが付いています。

最初、ディスプレイの値は整数xです。
すぬけ君の目標は、ディスプレイの値を整数yにすることです。
そのために、すぬけ君は次の2個のボタンを好きな順番で何回か押すことができます。

●ボタンA : ディスプレイの値を1増やす。
●ボタンB : ディスプレイの値の符号を反転する。

目標を達成するためにすぬけ君がボタンを押す回数の最小値を求めてください。
なお、整数x,yの値によらず、必ず目標を達成できることが示せます。

■■■入力■■■

x y

●x,yは整数である
●|x|,|y| <= 10億
●x,yは相異なる

■■■出力■■■

目標を達成するために、すぬけ君がボタンを押す回数の最小値を出力せよ。


C#のソース

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

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("10 20");
            //10
            //ボタンAを10回押せばよいです
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("10 -10");
            //1
            //ボタンBを1回押せばよいです
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("-10 -20");
            //12
            //次の順でボタンを押せばよいです。
            //●ボタンBを 1回押す
            //●ボタンAを10回押す
            //●ボタンBを 1回押す
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        int X = wkArr[0], Y = wkArr[1];
        Console.WriteLine(Solve(X, Y));
    }

    static int Solve(int pX, int pY)
    {
        if (pX == 0) {
            if (0 < pY) return pY;
            return -pY + 1;
        }
        if (pY == 0) {
            if (0 < pX) return 1 + pX;
            else return -pX;
        }

        int AbsDiff = Math.Abs(Math.Abs(pX) - Math.Abs(pY));

        if (0 < pX && 0 < pY) {
            //場合01
            if (pX < pY) return AbsDiff;
            //場合02
            else return 1 + AbsDiff + 1;
        }
        if (pX < 0 && pY < 0) {
            //場合03
            if (pX < pY) return AbsDiff;
            //場合04
            else return 1 + AbsDiff + 1;
        }
        if (0 < pX && pY < 0) {
            //場合05
            if (Math.Abs(pX) < Math.Abs(pY)) return AbsDiff + 1;
            //場合06
            else return 1 + AbsDiff;
        }
        if (pX < 0 && 0 < pY) {
            //場合07
            if (Math.Abs(pX) < Math.Abs(pY)) return 1 + AbsDiff;
            //場合08
            else return AbsDiff + 1;
        }
        return -1;
    }
}


解説

X,Yの少なくとも1つが0を含むかと、
X,Yの符号の組み合わせとX,Yの絶対値の大小関係で
漏れなく場合分けしてます。