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

ABC207-B Hydrate


問題へのリンク


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

    static void Main()
    {
        List<string> InputList = GetInputList();
        decimal[] wkArr = InputList[0].Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
        decimal A = wkArr[0];
        decimal B = wkArr[1];
        decimal C = wkArr[2];
        decimal D = wkArr[3];

        decimal Bunsi = A;
        decimal Bunbo = C * D - B;

        if (Bunbo <= 0) {
            Console.WriteLine(-1);
            return;
        }

        decimal Syou = Bunsi / Bunbo;
        decimal Mod = Bunsi % Bunbo;

        if (Mod > 0) {
            Console.WriteLine(Math.Truncate(Syou) + 1);
        }
        else {
            Console.WriteLine(Syou);
        }
    }
}


解説

N回の試行を行った時に条件を満たすかは
下記の不等式が成立した時です。

A + N * B <= N * C * D

この不等式を同値変形します。

A <= - N * B + N * C * D
A <= N * ( C * D - B)

この不等式を、Nで解く前に、
C * D - B の符号で場合分けします。

C * D - B が 負の場合は、A未満になるので解は無しと分かります。
C * D - B が 0 の場合も、A未満になるので解は無しと分かります。

C * D - B が 正の場合は、
A / (C * D - B) <= N
を満たすNが解と分かります。

最小のNを求める必要があるので
分数の端数処理を行ってます。