SDUT1281Cup

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

 

你可能感兴趣的:(UP)