POJ1905Expanding Rods(二分)

http://poj.org/problem?id=1905

题意 :在两堵实心墙中间有一根杆,长度为L,然后给它加热,温度是n,则两墙之间的杆会弯曲,长度会变为L'=(1+n*C)*L,求前后两个状态杆的中心位置的距离

思路 :一部分几何加上最主要的二分 。这个我发现小优姐写的特别好,分析的也很完美,我就不再多解释了,发一下链接吧http://blog.csdn.net/lyy289065406/article/details/6648562

#include<iostream>

#include<stdio.h>

#include<math.h>

#include<algorithm>

using namespace std ;

const double eps = 1e-8 ;

int main()

{

    double l,tem,c ;

    while(scanf("%lf %lf %lf",&l,&tem,&c)!=EOF)

    {

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

            break ;

        double s = (1+tem*c)*l ;

        double low = 0.0 ;

        double high = 0.5*l ;

        double mid ;

        while(high - low > eps)

        {

            mid  = (low+high)/2;

            double r = (4*mid*mid+l*l)/(8*mid) ;

            if((2*r*asin(l/(2*r))) < s)

                low = mid ;

            else high = mid ;

        }

        printf("%.3lf\n",mid) ;

    }

    return 0 ;

}
View Code

对于代码中对最小精度的规定,不能太小,若是太小的话,循环次数容易增多,会超时,一般到1e-10就是TLE,不过5到8都是0ms过的,所以要注意以下,还有一个要注意的点是二分循环不能直接用<=这样的话会陷入死循环,因为都是double类型的。

你可能感兴趣的:(exp)