51nod 1629 B君的圆锥(三分)

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

猜你喜欢

转载自blog.csdn.net/BBHHTT/article/details/81610850