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
を満たせば成立します。