题目大意:
给定一个杯子的体积,高度,上下底面半径,和其中水的体积,求水高。
思路:
浮点数二分,先由相似三角形求出上水面半径(用水高表示),然后二分之。
代码如下:
#include <iostream>
using namespace std;
double wV(double R, double r, double h, double H);
int main()
{
int T;
scanf("%d", &T);
const double eps = 1e-7;
while(T--)
{
double r, R, H, V;
scanf("%lf%lf%lf%lf", &r, &R, &H, &V);
double l=0, rr=H;
while(rr-l>eps)
{
double mid = (rr+l)/2;
double waterV = wV(R, r, mid, H);
//因为h大,算出的rw也大,最终体积也是会大的
if(waterV > V)
{
rr = mid;
}
else
{
l = mid;
}
}
printf("%.6f\n", l);
}
return 0;
}
double wV(double R, double r, double h, double H)
{
const double pi = 3.1415926535;
double rw = R*h/H + (H-h)/H*r;
double V = pi / 3 * h * (rw*rw + r*r + rw*r);
return V;
}