2016-08-19 4 views
2

hが与えられ、斜辺およびs、表面積、可能であれば直角三角形の辺を印刷するように求められます。そうでなければ-1を印刷します。だから私のアプローチだった。直角三角形は可能ですか?

double h,s; 
    scanf("%lf %lf",&h,&s); 
    s*=4; 
    double squaresum=(h*h) + s; 
    double squarediff=(h*h) - s; 
    if(squarediff<0) 
     printf("-1\n"); 
    else 
    { 
     double a = sqrt(squaresum)+sqrt(squarediff); 
     a/=2; 
     double b = sqrt(squaresum)-sqrt(squarediff); 
     b/=2; 
     if(h>=a+b) 
      printf("-1\n"); 
     else 
     printf("%.6lf %.6lf %.6lf\n",h,a,b); 
    } 

私のアプローチ:私たちは4を掛けた場合s考える
は、それはabは、三角形の他の側面です2*a*b、です。それで私はを持っているので、(a+b)^2(a-b)^2が見つかりました。 はそれも、カスタムテストケースを渡さ:

4 
5 6 
6 10 
258303 89837245228 
616153 77878145466 

出力:

4.000000 3.000000 5.000000 
-1 
-1 
546189.769984 285168.817674 616153.000000 

しかし、答えが間違っていると判断されています。私は、答えが間違っている可能性があるので、0<=h<=10^90<=s<=10^12を受け取ることができません。
https://www.codechef.com/problems/RIGHTTRI

+0

精密度が高い精度です。それはないかもしれませんが、それは非常に容疑者です。デルタとの比較を試みてください。 – bolov

+0

@bolov精度は少なくとも0.01のオーダーになっていて、6桁まで印刷していますので、精度はここの要素になりますか? – yobro97

+0

することができます。比較の中で。たとえば、 'h 'が' 5.9999'で 'a + b'が' 6.0001'ならば、それらの差は '0.0002'であり、これは与えられた精度によく似ています。三角形は可能ですが、あなたのコードでは '> ='ではなく '-1'を出力します。どのような比較においても、「0.01」のデルタを考慮する必要があります – bolov

答えて

5

リンク - 問題は、たぶん私は間違っているんだけど、私が読んでいる場合、出力は必要:

出力一行内の各テストケースのための答え。そのような三角形を見つけることができない場合は、-1を出力します。そうでない場合は、三角形の辺の長さに対応する3つの実数を降順で並べ替えて印刷します。。三角形の辺の長さは、正しい長さから絶対値で0.01を超えてはならないことに注意してください。

あなたの出力がソートされていない...私は非減少順を推測昇順を意味します...多分それを何かの前に打撃を与える...

(コメントに応じて質問を編集):

非減少順序は、長さによって、最低から最高にそれらに番号をソートしなければならないことを意味する:

3.000000 4.000000 5.000000

数学の問題を中心に問題彼らからあなたが欲しいものを理解することです...