码迷,mamicode.com
首页 > 其他好文 > 详细

hud 2289 要二分的杯子

时间:2015-07-20 21:14:06      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

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

 

hud 2289 要二分的杯子

标签:

原文地址:http://www.cnblogs.com/JJCHEHEDA/p/4662547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!