装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
//装水问题,有一侧面为半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h
#include<cstdio>
#include<cmath>
const double eps=1e-5;
const double PI=acos(-1.0);
double f(double R,double h)
{double angle=2*acos((R-h)/R);double L=sqrt(R*R-(R-h)*(R-h));//L为弦的一半 double s1=angle*R*R/2-L*(R-h);double s2=PI*R*R/2;return s1/s2;
}
double solve(double R,double r){double left=0,right=R;double mid;while(right-left>eps){mid=(right+left)/2;if(f(R,mid)>r)right=mid;else left=mid;}return mid;
}int main()
{double R,r;while(scanf("%lf %lf",&R,&r)!=EOF){printf("%f\n",solve(R,r));}return 0;
}
装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
装水问题,有一侧面看去是半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h (二分法的应用拓展)
//装水问题,有一侧面为半圆的储水装置,该圆的半径为R,要求往水中装入高度为h的水,使水的面积s1与半圆的面积s2的比例为r ,求h
#include<cstdio>
#include<cmath>
const double eps=1e-5;
const double PI=acos(-1.0);
double f(double R,double h)
{double angle=2*acos((R-h)/R);double L=sqrt(R*R-(R-h)*(R-h));//L为弦的一半 double s1=angle*R*R/2-L*(R-h);double s2=PI*R*R/2;return s1/s2;
}
double solve(double R,double r){double left=0,right=R;double mid;while(right-left>eps){mid=(right+left)/2;if(f(R,mid)>r)right=mid;else left=mid;}return mid;
}int main()
{double R,r;while(scanf("%lf %lf",&R,&r)!=EOF){printf("%f\n",solve(R,r));}return 0;
}