题目链接:http://poj.org/problem?id=1905
---------------------------------------------------------
题意:一个线段,给出长度、加热温度及热膨胀系数,线段加热后变为圆弧的一部分,要求求弧顶长度为多少。
思路:简单的画一下图,发现几何关系还是比较明确的,但是发现x的数学表达式并不容易解出来,所以采用二分法求值的方法。选择二分的对象很重要,直接选择对要求的x进行二分,避免角度误差太大。
代码:
#include <cstdio> #include <cmath> double L =0; double n=0; double C=0; const double PI =acos(-1.0); const double eps=1e-8; int jud(double mid){ if((2*asin((0.5*L)/((L*L+4*mid*mid)/(8*mid)))*(L*L+4*mid*mid)/(8*mid))>=(1+n*C)*L) return 0; else return 1; } double proce(){ double left =0; double right=L/2; double mid; while(right-left>eps){ mid = (left+right)/2; if (jud(mid)){ left = mid; }else{ right =mid; } } return mid; } int main(void){ while(~scanf("%lf %lf %lf",&L,&n,&C)){ if(L==-1&&n==-1&C==-1) break; else{ double h = proce(); printf("%.3f\n",h); } } return 0; }