B君要用一个表面积为S的圆锥将白山云包起来。
B君希望包住的白山云体积尽量大,B君想知道体积最大可以是多少。
注意圆锥的表面积包括底面和侧面。
Input
一行一个整数,表示表面积S。(1 <= S <= 10^9)
Output
一行一个实数,表示体积。
Input示例
8
Output示例
1.504506
相当郁闷!(漏了条件每次更新体积最大值)
代码如下:
#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;
}