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を求める必要があるので
分数の端数処理を行ってます。