POJ 1905 二分查找答案

一道精度很高的问题,虽然也不是很难

传送门:二分查找答案
题解:

求出r=(L^2+4h^2)/8h s=(2r*arcsin(L/2r))
二分区间查找h和真正的s对比当l-r>exp不满足时候跳出求解答案

注意
因为精度很高所以这里的折半不应该用/2.0而是*0.5*0.5的精度更高

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define exp 1e-8
using namespace std;
double L,C,k;
double GetS(double h)
{
    double r=(pow(L,2)+4*pow(h,2))/(8*h);
    double s=2*r*asin(L/(2*r));
    return s;
}
int main()
{

    while(~scanf("%lf %lf %lf",&L,&C,&k))
    {
        if(L<0&&C<0&&k<0)
           break;
        if(L==0||C==0||k==0)
        {
            printf("0.000\n");
            continue;
        }
        double Lx=(1.0+k*C)*L;
        double l=0,r=L*0.5,ans;
        while(r-l>exp)
        {
            double mid=(l+r)*0.5;
            if(GetS(mid)>Lx)
            {
                r=mid-1e-9;
                ans=mid;
            }
            else
            {
                l=mid+1e-9;
            }
        }
        printf("%.3lf\n",ans);
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值