标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5747 Accepted Submission(s): 1807
题解:这是一道经典的二分的题,要注意在二分的时候对精度的判断和对特殊情况的考虑比如水溢出的情况。在推算公式的时候也要注意分母上的数不要有可能等于0 ,这就要求用更加合理的方法推算公式,这个题就是要用倾斜角来算比较好,这样分母上就是H不可能等于0;
代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 #define PI acos(-1) 6 #define eps 1e-8 7 double r , R , H , rr ,v,vv; 8 double f(double h) 9 { 10 return h*(R-r)/H+r; 11 } 12 double g(double rr,double h) 13 { 14 return (1.0/3)*h*PI*(rr*rr+r*r+rr*r); 15 } 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--) 21 { 22 scanf("%lf %lf %lf %lf",&r,&R,&H,&v); 23 double tm = 1.0/3*PI*H*(R*R+r*r+R*r); 24 double left=0 , right=H , mid = H/2 ,vv = g(f(mid),mid); 25 if(tm<=v){ 26 printf("%.6lf\n",H); 27 continue;//注意是continue还是break,因为这个哇了 28 } 29 else{ 30 while(fabs(vv-v) > eps){ 31 if(vv>v) 32 right = mid; 33 else 34 left = mid ; 35 mid = (left+right)/2; 36 vv = g(f(mid),mid); 37 } 38 printf("%.6lf\n",mid); 39 } 40 } 41 return 0; 42 }
标签:
原文地址:http://www.cnblogs.com/shanyr/p/4889338.html