这道题要求高度,而且是高精度
所以对高度二分,在0到H之间取值
AC这道题,发现时间是0毫秒....瞬间觉得二分特别强大,有木有。。。。
#include <iostream>
#include <cmath>
#define pi 3.1415926535897932384626433832795
#define eps 1e-8
using namespace std;
double f1(double r,double R,double h,double H)
{
double u=h/H*(R-r)+r;
return 1.0/3*pi*h*(u*r+r*r+u*u);
}
int main()
{
int t;
double r,R,H,V;
cin>>t;
while(t--)
{
scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
double low=0.0;
double high=H;
double mid;
while(high-low>eps)
{
mid=(high+low)/2;
double vv=f1(r,R,mid,H);
if(abs(vv-V)<eps)
break;
else if(vv>V)
high=mid-eps;
else
low=mid+eps;
}
printf("%.6lf\n",mid);
}
return 0;
}