水平面的半径u可以根据直角梯形的面积求出:
(r+u)*h + (u+R)*(H-h) = (r+R)*H
得出(R-r)*h = (u-r)*H
得 u = r + (R-r)*h/H
圆台体积计算公式:V= π*h*( R^2 + R*u + u^2 ) / 3
一直WA,找不到原因在哪里,所以就百度,查了n遍实在找不到那里错,结果改了二分标记的地方就AC了。以后得好好研究一下为什么。
#include<stdio.h>
#include<math.h>
double pi=acos(-1);
double ri,rr,h,v;//ri是r,rr是R
double cal(double x)
{
double u=(rr-ri)*x/h+ri;
return (pow(ri,2)+pow(u,2)+ri*u)/3*pi*x;
}
int main()
{
int cases;
double left,right,mid;
while(scanf("%d",&cases)!=EOF){
while(cases--){
scanf("%lf%lf%lf%lf",&ri,&rr,&h,&v);
left=0;
right=rr;
while(right-left>1e-10){
mid=(left+right)/2;
if(cal(mid)>v){
right=mid;//right=mid-1e-10;
} else{
left=mid;//left=mid+1e-10;
}
}
printf("%.6lf\n",(left+right)/2);
}
}
return 0;
}