应该是可以直接推出公式的,本弱不会,就写了一个三分法。
看题意就应该能知道体积先随着半径的增长而变大,然后变小,是但峰的
#include <cmath>
#include <cstdio>
using namespace std;
const double eps = 1e-8;
#define PI acos(-1.0)
double S;
double GetH(double r){
double a = S/PI/r - r;
a = a*a - r*r;
return sqrt(a);
}
double GetV(double r, double h){
return PI*r*r*h/3;
}
int main(){
while(scanf("%lf", &S) != EOF){
double l, r, lm, rm, lV, rV;
l = 0.00001;
r = sqrt(S/PI/2);
while(r-l > eps){
lm = (r-l)/3 + l;
rm = (r-l)/3*2 + l;
lV = GetV(lm, GetH(lm));
rV = GetV(rm, GetH(rm));
if(lV < rV) l = lm;
else r = rm;
}
double h = GetH(r);
double V = GetV(r, h);
printf("%.2lf\n%.2lf\n%.2lf\n", V, h, r);
}
return 0;
}