POJ 1905 Expanding Rods几何题,二分

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

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

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

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

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

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

POJ 1905 Expanding Rods几何题,二分_第1张图片

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

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

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

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

code:

#include
#include
#include
#include
#include
#include
#include
#include
#include


#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);
    }
}


你可能感兴趣的:(计算几何)