1629 B君的圆锥
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
B君要用一个表面积为S的圆锥将白山云包起来。
B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。
注意圆锥的表面积包括底面和侧面。
Input
一行一个整数,表示表面积S。(1 <= S <= 10^9)
Output
一行一个实数,表示体积。
Input示例
8
Output示例
1.504506
对于非线性函数,无法使用二分法,这个时候就要使用三分法了。
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define pi 3.1415926
#define eps 1e-9
#define inf 0x3f3f3f3f;
double maxv;
double calc(double r ,double s)
{
double l = s/(pi*r)-r;
if(l-r<=0) return -1;//此时的l,r不成立
double v=pi*r*r*sqrt(l*l-r*r)/3.0;
if(v>maxv) maxv=v;//记录最大体积
return v; //返回当前计算的体积
}
void three(double s)
{
double left=0;
double right=s;
double mid,midmid,mid_v,midmid_v;
while( left + eps<right)
{
mid=(left+right)/2.0;
midmid=(mid+right)/2.0;
mid_v=calc(mid,s);//这里在cacl函数中用mid(s的一小部分)表示r,想不到。
midmid_v=calc(midmid,s);
if(mid_v>=midmid_v)//类似二分,更新
right=midmid;
else
left=mid;
}
printf("%lf\n",maxv);
return;
}
int main()
{
double s;
maxv=-inf;
scanf("%lf",&s);
three(s);
return 0;
}