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类型的。

posted on 2013-11-07 00:12  枫、  阅读(164)  评论(0编辑  收藏  举报