您的位置:首页 > 其它

BSG白山极客挑战赛 -- B君的圆锥 (三分法求最值)

2016-05-21 00:37 288 查看
B君的圆锥





wwwwodddd (命题人)

基准时间限制:1 秒 空间限制:131072 KB 分值: 40

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: