题目大意:
一个圆台型的杯子,告诉你杯子的水的体积,要求水的高度。
解题思路:
将水的高度作为x,然后化简出f(x)方程,二分求x,至于圆台的体积公式:v = pi * h * (R*R+R*r+r*r) / 3; 水的高度根据直角梯形的面积公式即可求解。
代码:
/*
*圆台体积公式:v = pi * h * (R*R+R*r+r*r) / 3;
*水的体积: v = pi * sqrt(r*q) * (r*R + sqrt(r*R)*r+r*r) / 3;
*/
#include<iostream>
#include<cmath>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1.0e-10;
double getWaterV(double R, double r, double h, double m)
{
double y = (r * h + m * R - r * m) / h;
return pi * m * (y * y + y * r + r * r) / 3;
}
int main(void)
{
int cas;
scanf("%d", &cas);
while(cas--)
{
double r, R, h, v;
scanf("%lf %lf %lf %lf", &r, &R, &h, &v);
double left = 0, right = h, m;
while(abs(left - right) > eps)
{
m = (left + right) / 2;
if(getWaterV(R, r, h, m) < v)
left = m;
else
right = m;
}
printf("%.6lf\n", m);
}
return 0;
}