题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289
大意是 一个Cup,圆台形,给你它的顶部圆的半径,底部圆的半径,杯子的高度,和此时里面装的水的体积,求水的高度。
这道题好在能够锻炼算法思维,或者说形成算法思维。
这是一道二分逼近求值的应用
题目已经给定杯子的高度是0~100,故在这个范围内进行二分,但走了涉及到还有小数的问题,故可以取一个精度较高的误差值
来作为二分的条件,二分一次,以这个值作为水的高度求出水的体积与实际值比较一次,当误差不大于误差值时,便取为高。
另圆台体积公式:设上底的半径为r ,下底的半径为R ,高为h则V= (1/3)*pi*h*(R^2 + Rr +r^2) pi为圆周率
1 #include <stdio.h> 2 #include <math.h> 3 double PI=acos(-1.0); //圆周率 4 double haha = 0.000000001;//取误差值 5 6 double yj(double r,double R,double h,double H) 7 { 8 double u = h/H*(R-r) + r; //求出水面圆的半径 9 return PI/3*(r*r+r*u+u*u)*h;//返回水圆台的体积 10 } 11 12 double ls(double r,double R,double H,double v) 13 { 14 double left,right,temp,mid; 15 left = 0,right = 100; 16 while ((right-left)>haha)//二分条件变成了与误差值相比较 17 { 18 mid = (left+right)/2; 19 temp= yj(r,R,mid,H); 20 if (fabs(temp-v)<=haha) 21 return mid; 22 else if(temp<v) 23 left=mid+haha; 24 else 25 right = mid-haha; 26 } 27 return (right+left)/2; 28 } 29 30 int main() 31 { 32 int t; 33 double r,R,H,v; 34 while (~scanf("%d",&t)){ 35 while (t--) 36 { 37 scanf("%lf%lf%lf%lf",&r,&R,&H,&v); 38 printf("%.6lf\n",ls(r,R,H,v)); 39 } 40 } 41 return 0; 42 }