B君要用一个表面积为S的圆锥将白山云包起来。
B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。
注意圆锥的表面积包括底面和侧面。
Input
一行一个整数,表示表面积S。(1 <= S <= 10^9)
Output
一行一个实数,表示体积。
Input示例
8
Output示例
1.504506
转载于:http://www.cnblogs.com/vongang/archive/2012/10/30/2745988.html
二分法只适用与线性函数,当函数脱离线性而呈现凸性或者凹性的时候,三分是很有必要的。
三分过程如下图:
凸函数:
凹函数:
【感受】
你还在为求最值而推好几页的公式吗?你还在为求最值而推不出来结果而烦 恼吗?没有关系~!看了三分法的介绍,就知道求最值原来可以这么简单,就 运行一个生成树的代码就可以了,可怜我以前光推公式推半个多小时还不一定 对
,还是知道的东西太少啊,以后求最值问题不用推好几页了!
【代码】
/* 三分法求最值*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define eps 1e-9
#define pi 3.1415926
double maxV;
double Calc(double r, double s)
{
double l = s / (pi * r) - r;
if (l - r <= 0) return -1; //不成立
double h = sqrt(l*l - r*r);
double v = pi*r*r*h / 3.0;
if (maxV < v) maxV = v; //必须在此取最大值!
return v; //返回当前计算的体积
}
void three(double s) //三分法
{
double Left, Right;
double mid, midmid;
double mid_value, midmid_value;
Left = 0;
Right = s;
while (Left + eps < Right)
{
mid = (Left + Right) / 2;
midmid = (mid + Right) / 2;
mid_value = Calc(mid, s);
midmid_value = Calc(midmid, s);
// 假设求解最大极值.
if (mid_value >= midmid_value) Right = midmid;
else Left = mid;
}
printf("%.6f\n", maxV);
}
int main()
{
//#ifdef OFFLINE
// freopen("t.txt", "r", stdin);
//#endif
double s;
while (~scanf("%lf", &s))
{
maxV = -inf; //初始化为无穷小
three(s);
}
return 0;
}
有问题留言~~~