首页 > 代码库 > POJ 3737/三分

POJ 3737/三分

题目链接[http://poj.org/problem?id=3737]

题意:给出一个圆锥的表面积,求最大的体积,并输出最大体积的时候的圆锥的高度和底面积。 

方法一:

  根据定理:圆锥的表面积一定的时候,当圆锥的斜边长度是底边半径三倍的时候,圆锥的体积最大。

#include<cmath>
#include<cstdio>
const double PI = acos(-1.0);
int main ()
{
    double s,h,r,v;
    while(~scanf("%lf",&s))
    {
        r=sqrt(s/PI)/2;
        h=sqrt(8*r*r);
        v=PI*r*r*h/3;
        printf("%.2f\n%.2f\n%.2f\n",v,h,r);
    }
    return 0;
}

方法二:

/
   化简体积表达式可知,v和r的关系是一个抛物线函数,求最大值,则对r三分即可。

*/
#include<cmath>
#include<cstdio>
const double PI = acos(-1.0);
double s,h,r,v;
double area(double R)
{
    double L=s/(PI*R)-R;
    double H=sqrt(L*L-R*R);
    return PI*R*R*H/3.0;
}
int main ()
{
    while(~scanf("%lf",&s))
    {
        double ll=0,rr=sqrt(s/(2*PI)),midl,midr;
        while(rr-ll>1e-5)
        {
            midl=(ll+rr)/2.0;
            midr=(midl+rr)/2.0;
            if(area(midl)>area(midr))
                rr=midr;
            else
                ll=midl;
        }
        r=(rr+ll)/2.0;
        double L=s/(PI*r)-r;
        h=sqrt(L*L-r*r);
        v=area(r);
        printf("%.2f\n%.2f\n%.2f\n",v,h,r);
    }
    return 0;
}

 

  

 

POJ 3737/三分