一般的なアイデア
3つの整数aaを入力してくださいa、bbb、ccc 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<10が確立されます。
分析
間違った考え
まず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+2ab<c
2 ab <c − a − b 2 \ sqrt ab <c --a --b2ab<c−a−b
(2 ab)2 <(c − a − b)2(2 \ sqrt ab)^ 2 <(c --a --b)^ 2(2ab )2<(c−a−b )2
4 ab <(c − a − b)2 4ab <(c --a --b)^ 24 a b<(c−a−b )2
注:別の場合があります。つまり、c − a − b <0 c-a-b <0c−a−b<0またはc <a + bc <a + bc<a+b、答えは「はい」である必要がありますNo
。この場合WA
、(c − a − b)2(c-a-b)^ 2であるため、会議は考慮されません。(c−a−b )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;
}