Description
告诉你一个圆锥的表面积(包括底面积),问最大的体积是多少。
Input
多组数据。 每组数据一行一个实数S,表示圆锥的表面积。 1≤S≤10000.
Output
每组数据输出3行:
第一行一个实数表示最大的体积。
第二行一个实数表示圆锥的高。
第三行一个实数表示圆锥的底面半径。
所有实数精确到0.01。
Sample Input
30
Sample Output
10.93
4.37
1.55
Sulution
列出体积对于底面半径的公式后发现是个单峰函数。
所以三分底面半径就行了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-6;
double cal(double r, double s) {
double L = (s - r * r * pi) / pi / r;
double H = sqrt(L * L - r * r);
return r * r * H * pi / 3.0;
}
int main() {
// freopen("3737.in", "r", stdin);
double s;
while (~scanf("%lf", &s)) {
double l = 0, r = sqrt(s / pi);
while (l + eps < r) {
double m1 = l + (r - l) / 3.0;
double m2 = r - (r - l) / 3.0;
double v1 = cal(m1, s);
double v2 = cal(m2, s);
if (v1 > v2) {
r = m2;
} else l = m1;
}
double L = (s - pi * r * r) / pi / r;
double H = sqrt(L * L - r * r);
double V = r * r * H * pi / 3.0;
printf("%.2lf\n%.2lf\n%.2lf\n", V, H, r);
}
return 0;
}