Gym - 100113E
给定圆台的一面的直径和法线长度,问最大体积
直接三分就好了。
#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
double L, D, l, r, mid1, mid2, v1, v2, ans;
double get(double x) {
return sin(x)*(D*D*3+L*D*6*cos(x)+L*L*cos(x)*cos(x)*4)*pi*L/12.0;
}
int main() {
freopen("frustum.in","r",stdin);
freopen("frustum.out","w",stdout);
scanf("%lf %lf", &L, &D);
l = 0; r = pi/2.0;
for (int T = 1; T <= 100000; T++) {
mid1 = l+(r-l)/3.0;
mid2 = l+(r-l)/3.0*2;
v1 = get(mid1);
v2 = get(mid2);
if (v1 > v2) {
ans = max(ans, v1);
r = mid2;
} else {
ans = max(ans, v2);
l = mid1;
}
}
printf("%.10lf\n", ans);
}