POJ 1905 Expanding Roads

 

很少做几何题— —bbb,不废话

设膨胀后形成的圆弧所在的圆半径为R,所对应的弧度为H,所求的结果距离为x,则由几何知识可得到公式:勾股定理:(L/2)^2+(R-

x)^2=R^2得到R=x^2+(L/2)^2/(2*x)(程序中对应R=(mid*mid+L*L/4)/2/mid),然后又有sin(H)=L/2/R==>H=asin(L/2/R),而根据某个

定理(汗,忘了什么定理),弧长=半径*弧度得到:求到的弧长为 R*asin(L/2/R),再与实际的弧长对比,不符合继续二分枚举即可。

#include<iostream> #include<cmath> using namespace std; const double esp=1e-5; int main() { double n,L,_L,C; double mid,lit,big,R; while(scanf("%lf%lf%lf",&L,&n,&C)&&(L>=0 && n>=0 && C>=0)) { lit=0; big=L/2; _L=(1+n*C)*L; while(big-lit>esp) { mid=(big+lit)/2; R=(mid*mid+L*L/4)/2/mid; if(R*asin(L/2/R)<_L/2) lit=mid; else big=mid; } printf("%.3lf/n",big); } return 0; }

 

PS:本人写博,纯属装X(A<X<C)

 

 

你可能感兴趣的:(c)