pku 1905 二分 Expanding Rods 解题报告

pku 1905 二分 Expanding Rods 解题报告

解题思路:

由公式 弦长 = 2*r*sin(弧长/2*r)

b=2*r * sin(a / (2r)) a为弧长,b为弦长

b/a=2r/a*sin(a/(2r))

a/2r相当于a*pi / 2r*pi 即弧角=弧度=弧长/半径

推理可知范围在0~pi/2 假设为x=a/(2r),即为弧长一半所对应的圆心角

b/a=sinx/x

在弦长一半b/2与所求高度result所围成的直角三角形中,由正弦定理得: sin(y)/result=sin(z)/(b/2) ,其中y =(pi-x)/2-(pi/2-x),z=(pi-x)/2

化简为: result=(1 - cos(x)) * b / (2 * sin(x))

AC代码:

#include <cmath>

#include <iostream>

using namespace std;

const double eop = 1e-12;

const double pi = acos(0.0);

int main()

{

       //freopen("1.txt", "r", stdin);

       //freopen("2.txt", "w", stdout);

       double l, n, c;

       while (scanf("%lf%lf%lf", &l, &n, &c))

       {

              if (l == -1 && n == -1 && c == -1)

              {

                     break;

              }

              double b, a;

              b = l;

              a = (1 + n * c) * b;

              double low, high, mid;

              low = 0;

              high = pi;

              while (low + eop < high)

              {

                     mid = (high + low) / 2.0;

                     if (sin(mid) / mid > b / a)

                     {

                            low = mid;

                     }

                     else

                     {

                            high = mid;

                     }

              }

              printf("%.3lf/n", (1 - cos(high)) * b / (2 * sin(high)) );

       }

       return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值