题解:如果知道水面的高度,则直接可以算出水的体积,我们知道水的高度必然在0到最大高度之间,于是在这个区间内进行二分检索即可:
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define PI 3.1415926535897932384626 #define exp 1e-9 double solve(double r,double R,double h,double H) { double u = h/H*(R-r) + r; return PI/3*(r*r+r*u+u*u)*h; } int main() { int t; double r,R,H,V,mid,vv,f,l; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&r,&R,&H,&V); f=0; l=100; while(l-f>exp) { mid=(l+f)/2; vv=solve(r,R,mid,H); if(fabs(vv-V)<=exp) break; else if(vv>V) l=mid-exp; else f=mid+exp; } printf("%.6lf ",mid); } return 0; }
fabs函数是对实数进行取绝对值用的。