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