パナソニックプログラミングコンテスト2020C(平方根不等式)题解

一般的なアイデア

3つの整数aaを入力してくださいabbbccc ifa + b <c \ sqrt a + \ sqrt b <\ sqrt ca +b <c 確立されている場合は出力しYes確立されていない場合は出力しますNo

サンプル

#1を入力してください

2 3 9

出力#1

No

2 + 3 <9 \ sqrt 2 + \ sqrt 3 <\ sqrt 9 2 +3 <9 無効。

入力#2

2 3 10

出力#2

Yes

2 + 3 <1 0 \ sqrt 2 + \ sqrt 3 <\ sqrt 10 2 +3 <1 0が確立されます。

分析

間違った考え

まずsqrtシステム関数の浮動小数点精度エラーのため、次のコードは明らかに次のようになりますWA

#include <cstdio>
#include <cmath>
using namespace std;

int main(int argc, char** argv)
{
    
    
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	double d = sqrt(double(a)) + sqrt(double(b));
	puts(d * d < c? "Yes": "No");
	return 0;
}

したがって、この質問には特別な思考が必要です

正しい考え方

正しい方法の導出プロセスは次のとおりです
。a+ b <c \ sqrt a + \ sqrt b <\ sqrt ca +b <c
(a + b)2 <(c)2(\ sqrt a + \ sqrt b)^ 2 <(\ sqrt c)^ 2 ((a +b )。2<((c )。2
a + b + 2 ab <ca + b + 2 \ sqrt ab <ca+b+2a b<c
2 ab <c − a − b 2 \ sqrt ab <c --a --b2a b<cab
(2 ab)2 <(c − a − b)2(2 \ sqrt ab)^ 2 <(c --a --b)^ 22a b 2<cab 2
4 ab <(c − a − b)2 4ab <(c --a --b)^ 24 a b<cab 2
注:別の場合があります。つまり、c − a − b <0 c-a-b <0cab<0またはc <a + bc <a + bc<a+b、答えは「はい」である必要がありますNoこの場合WA(c − a − b)2(c-a-b)^ 2であるため、会議は考慮されません。cab 2は「負の数を直接無視する」でしょう!

コード

#include <cstdio>
using namespace std;

int main(int argc, char** argv)
{
    
    
	long long a, b, c;
	scanf("%lld%lld%lld", &a, &b, &c);
	long long d = c - a - b;
	if(d < 0) puts("No"); // 特殊情况c - a - b < 0直接输出No
	else puts((d * d > 4LL * a * b)? "Yes": "No");
	return 0;
}

ACスクリーンショット

おすすめ

転載: blog.csdn.net/write_1m_lines/article/details/104897725