AtCoderの企業コンテスト
次の企業コンテストの問題へ
前の企業コンテストの問題へ
パナソニックプログラミングコンテスト2020 C Sqrt Inequality
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("2 3 9");
//No
}
else if (InputPattern == "Input2") {
WillReturn.Add("2 3 10");
//Yes
}
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 A = wkArr[0];
long B = wkArr[1];
long C = wkArr[2];
long UhenSqrt = C - A - B;
if (UhenSqrt < 0) {
Console.WriteLine("No");
return;
}
if (4 * A * B < UhenSqrt * UhenSqrt) {
Console.WriteLine("Yes");
}
else {
Console.WriteLine("No");
}
}
}
解説
まず、数学の前提知識として、SとTが0以上の場合は、下記の2つの同値関係が成立します。
S > T ⇔ S*S > T*T
S >= T ⇔ S*S >= T*T
sqrt(A) + sqrt(B) < sqrt(C)
左辺と右辺は 共に0以上なので
A+B+ 2*sqrt(A*B) < C
に同値変形できます。
移項も同値変形なので
2*sqrt(A*B) < C - A - B
に同値変形できます。
左辺は0以上なので
右辺が0以上かで場合分けし、
右辺が負なら、この不等式は、解なしです。
右辺が0以上なら
左辺と右辺は 共に0以上なので
両辺を2乗しても同値なため
4*A*B < C - A- B
に同値変形できます。
まとめると
sqrt(A) + sqrt(B) < sqrt(C) は
C - A - B が 負なら 解なし
C - A - B が 0以上なら
4*A*B < C - A- B
を満たせば成立します。