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); }