题意:

        给定一个圆台的上底半径,下底半径和高,给出一定体积的水,求这些水在圆台内的体积。

 

        简单的二分法逼近求高,过程中因为忘记了怎么求小圆台的上底半径而超时了几次。

TLE代码:

 

#include<iostream>
#include
<cstdio>
#include
<math.h>
using namespace std ;
double h = 0, h1, r1, r2, r3, r ;
void f1(){
    h1 
/= 2 ;
    h 
+= h1 ;
    r3 
= r ;
    r 
= (r + r2) / 2 ;
}
void f2(){
    h1 
/= 2 ;
    h 
-= h1 ;
    r 
= (r + r3) /2 ;
}
int main(){
    
double v1, v2 ;
    
int m ;
    
double const PI = acos(double(-1)) ;
    cin 
>> m ;
    
while(m--){
        cin 
>> r1 >> r2 >> h1 >> v2 ;
        r 
= r1 ;
        
while(true){
            v1 
= PI*(r1*r1+r*r+r1*r)*h/3 ;
            
if(fabs(v1-v2)<0.00000001){
                printf(
"%.6f", h) ;
                
break ;
            }
            
else if(v1<v2)  f1() ;
            
else f2() ;
        }
    }
    
return 0 ;
}

 

AC代码:

#include<iostream>
#include
<cstdio>
#include
<math.h>
using namespace std ;
double h, h1, r1, r2, r, v, v1 ;
int main(){
    
int m ;
    
double const PI = acos(double(-1)) ;
    cin 
>> m ;
    
while(m--){
        cin 
>> r1 >> r >> h1 >> v ;
        
double L=0, H=h1, M ;
        
while(H-L>0.0000001){
            M 
= (L + H) / 2 ;
            r2 
= M / h1 * (r-r1) + r1 ;   //根据比例关系求小圆台的上底半径
            v1 
= PI*(r1*r1+r2*r2+r1*r2)*M/3 ;
            
if(v1>v)    H = M ;
            
if(v1<v)    L = M ;
        }
        printf(
"%.6lf\n", M) ;
    }
    
return 0 ;
}

 

 

posted on 2011-08-25 09:42  追逐.  阅读(250)  评论(0编辑  收藏  举报