【问题标题】:Is a right angle triangle possible?直角三角形可能吗?
【发布时间】:2016-08-19 06:30:42
【问题描述】:

给定斜边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);
   }

我的做法:
给定s,如果我们乘以4,那么它就是2*a*b,其中ab 是三角形的另一边。然后我找到(a+b)^2(a-b)^2,因为我有h*h=a^2+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&lt;=h&lt;=10^90&lt;=s&lt;=10^12,我无法了解答案如何出错。 问题链接-
https://www.codechef.com/problems/RIGHTTRI

【问题讨论】:

  • precision..precision..precision.. 可能不是这样,但这是一个高度怀疑。尝试使用 delta 进行比较。
  • @bolov 给出的精度至少是0.01 的顺序,并且我已将其打印到小数点后 6 位.....所以这里的精度是否会成为一个因素..??
  • 可以的。在比较中。例如,如果在你的程序中 h5.9999a+b6.0001 那么它们之间的区别是 0.0002 这远远低于你给出的精度,这意味着它们应该被认为是相等的,所以三角形可能,但在您的代码中认为它们不是&gt;=,它将输出-1。在每次比较中,您都应该考虑到 0.01 的增量
  • @bolov 法官在打印侧面时要求0.01 精度......但它应该始终以最大精度计算,所以在你给定的情况下,我猜答案应该是@ 987654349@ .....如果我错了,请纠正我!...我在问题中添加了问题链接...
  • 您的代码对我来说看起来不错。我获取了您的代码并添加了几行以从 ab 重新计算 hs,然后添加 printf 行以打印输入 hs 并计算 @987654357 @ 和 s。他们非常接近。见ideone.com/Vsmre9

标签: c math


【解决方案1】:

也许我错了,但如果我阅读了所需的输出:

在一行中输出每个测试用例的答案。如果找不到这样的三角形,则输出-1。否则打印 3 个实数,对应于 按非递减顺序排序的三角形边的长度。请注意,三角形边的长度与正确长度的绝对值之差不应超过 0.01。

您的输出未排序...我猜非递减顺序意味着增加顺序...也许先试一试...

(根据评论编辑问题):

非递减顺序意味着您必须按长度从最低到最高对它们进行排序:

3.000000 4.000000 5.000000

主要是数学问题的问题是了解他们想从你这里得到什么......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多