题目描述
题解
三分法
设圆锥底面半径为r,高为h
V=(s2−2sπr2)r2−−−−−−−−−−−√
,类似于一个关于r的二次函数单峰
三分r
计算
h=s2−2sπrπ2r2−−−−−−√
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-6;
int dcmp(double x)
{
if (x<=eps&&x>=-eps) return 0;
return (x>0)?1:-1;
}
double s,r,h,v;
double calc(double r)
{
double h=sqrt((s*s-2*s*pi*r*r)/(pi*pi*r*r));
return (1.0/3.0)*pi*r*r*h;
}
double find()
{
double l=0,r=sqrt(s/pi),mid1,mid2,ans;
while (dcmp(r-l)>0)
{
mid1=l+(r-l)/3.0;
mid2=r-(r-l)/3.0;
if (calc(mid1)<=calc(mid2)) ans=mid2,l=mid1;
else r=mid2;
}
return ans;
}
int main()
{
while (~scanf("%lf",&s))
{
r=find();
h=sqrt((s*s-2*s*pi*r*r)/(pi*pi*r*r));
v=calc(r);
printf("%.2lf\n%.2lf\n%.2lf\n",v,h,r);
}
}