题目链接: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 }

 

posted on 2015-07-20 20:21  蜘蛛侦探  阅读(351)  评论(1编辑  收藏  举报