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 ",h); } return 0; }