POJ 1905 Expanding Rods几何题,二分

由于热胀冷缩,一根长度为L的木棒在温度上升n度的时候,会膨胀为L‘=(1+C*n)L,其中C为膨胀系数。

起初,一根木棒恰好卡在两块板子之间,现在加热令其膨胀,假定其膨胀为一个圆弧,为弧形的弓形高是多少?

每组输入给出的是原长,温度,膨胀系数

本质上就是,给你一条圆弧的拱形长度(跨度),求弓形高。

数学题,不过做起来并没有那么那么的显然,并不是直接推公式的

当然,设所求答案为x,得到以下两式


注意有两个未知量x和r,r为圆弧半径,要显式地表达x必须先显式地表达r,而方程2为超越方程

对此,我最初是走了两个二分,由于L和L'一开始就确定了,我对方程2二分出一个值作为r,之后再对方程1 二分得到x值,样例能对,但是wa

所以感觉两个二分对精度的损失过大了

于是改写了式子,过程中对每个x值用方程1求对应的r值,再利用方程2进行二分,这样实际上只有一个二分过程,精度得到提高

code:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<cstdlib>


#define maxn 1001010
#define inf 0x3f3f3f3f
#define LL long long

using namespace std;

const double pi=3.141592653589793;
const double eps=1e-8;

double L,t,c,L1,r;
int main()
{
    while(scanf("%lf%lf%lf",&L,&t,&c))
    {
        if(L<0&&t<0&&c<0)break;
        if(t==0.0)
        {
            printf("0.000\n");
            continue;
        }
        L1=(1+t*c)*L;
        double low,high,mid;
        low=0;
        high=0.5*L;
        mid=(low+high)/2;
        while(high-low>eps)
        {
            mid=(low+high)/2;
            r=(4*mid*mid+L*L)/(8*mid);
            if(2*r*asin(L/(2*r))>=L1)
                high=mid;
            else
                low=mid;
        }
        printf("%.3lf\n",mid);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值