HDU 2289 Cup

题解:如果知道水面的高度,则直接可以算出水的体积,我们知道水的高度必然在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\n",mid);  

    }  

    return 0;  

}  

 

fabs函数是对实数进行取绝对值用的。

 

你可能感兴趣的:(HDU)