http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1281

题意 : 一个杯子,告诉你底面半径,顶端半径,杯子高度,里边装有的热水的量,让你求杯中水的高度

思路 : 就是一个简单的数学公式问题,也没有什么要特别注意的地方,杯子有两种形状,圆柱和圆台,圆柱的话直接用体积除以底面积即可得,而圆台的话,就这么去求肯定是求不出来的,所以就要用间接法,就是先把圆台补全,补成一个大圆锥,通过求小圆锥的高h0 = H*r/(R-r),就可以求出多补的小圆锥的体积v0 = (pi*h0*r*r)/3,数学上,这个小圆锥体积v与大圆锥的体积之比为高之比的3次方(v0+v)/v0 =((h+h0)/h0)^3,还有一个要注意的点是,若是水的体积大于杯子的体积那么求出的h将大于H,此时最大的h应该为杯子子的高度。

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
double pi = acos(-1.0);
int main()
{
    int t;
    double r,R,H,V,h,h0,v0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
        if(r==R)
        {
            h = V/(pi*r*r);
        }
        else if(r<R)
        {
            h0 = H*r/(R-r);
            v0 = (pi*h0*r*r)/3;
            h = h0*(pow((v0+V)/v0,1.0/3)-1);
        }
         if(h>H) h = H;
         printf("%.6f\n",h);
    }
    return 0;
}
View Code

 

posted on 2013-08-24 20:49  枫、  阅读(163)  评论(0编辑  收藏  举报