题意:
给定一个圆台的上底半径,下底半径和高,给出一定体积的水,求这些水在圆台内的体积。
简单的二分法逼近求高,过程中因为忘记了怎么求小圆台的上底半径而超时了几次。
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 ;
}
#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 ;
}
#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 ;
}