题目地址
题目大意:给定一个圆锥体的表面积s,求这个圆锥体的最大体积以及圆锥体体积最大时的底面半径和高。
题目分析:题意十分简单明了。根据圆锥体表面积公式:π * r * r + π * r * l = s(r是底面半径,l是母线长),l = sqrt(h* h + r * r),带入表面积方程可得圆锥高h = sqrt((s/π/r - r)^2 - r * r),根据此式可得一不等式:s/π/r >2r。由此得出底面半径上界为sqrt(s/2π).继续整理方程可得圆锥体体积v = π*sqrt(s^2*r^2/π/π - 2sr^4/π)/3。可以很清楚的看出,圆锥体的体积v是关于圆锥体底面半径的一个2次方程,开口向下,是个凸形图形求极值的问题,很容易想到三分底面半径r。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define eps 1e-8
#define PI acos(-1.0)
double s,h,r,v;
double geth(double ra)//求当圆锥底面半径为ra时的高
{
double hi;
hi = (s/PI/ra - ra) * (s/PI/ra - ra);
hi -= (ra * ra);
if(hi < 0)
return -1;
hi = sqrt(hi);
return hi;
}
int main()
{
while(scanf("%lf",&s) != EOF)
{
double l,r,midl,midr,v1,v2;
l = 0;
r = sqrt(s / PI / 2);
while(r - l > eps)
{
midl = (l + r) / 2;
midr = (r + midl) / 2;
v1 = geth(midl);
v2 = geth(midr);
v1 = PI * midl * midl * v1 / 3;
v2 = PI * midr * midr * v2 / 3;
if(v1 > v2)
r = midr;
else
l = midl;
}
printf("%.2lf\n%.2lf\n%.2lf\n",v1,geth(midl),midl);
}
return 0;
}