题目大意: 
        一个圆台型的杯子,告诉你杯子的水的体积,要求水的高度。
解题思路:
        将水的高度作为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;
}

posted on 2012-08-03 02:11  cchun  阅读(185)  评论(0编辑  收藏  举报