poj3737 UmBasketella 真正的三分

之前用二分写三分的板子。。。现在正式写一个三分,但是也不难,就是把区间分为三段就行了。求二次函数的峰值,每次取大的区间就行了。

题干:

最近几天,人们总是设计出多功能的新东西。例如,您不仅可以使用手机给朋友打电话,还可以使用手机拍照或听MP3。另一个例子是手表和电视的结合。这些多功能项目总能改善人们的日常生活,深受用户青睐。

Umbrella公司最近为彩虹城的人们发明了一种新型伞“UmBasketella”,它的想法也来自于这种多功能 - 伞和日用品的组合。这种伞可以用作篮子,你可以放入你想要携带的东西。由于彩虹城经常下雨,这种创新用途是成功的,“UmBasketella”卖得很好。不幸的是,最初的“UmBasketella”没有自动音量控制技术,因此当用户试图在其中放入太多东西时很容易损坏。要解决这个问题,您需要设计一个具有最大音量的“UmBasketella”。假设“UmBasketella”是一个锥形容器,其表面区域(包括底部)是已知的,

输入

输入包含几个测试用例。Eash案例仅包含一个实数S,表示锥体的表面积。这是保证1≤ 小号 ≤10000。

产量

对于每个测试用例,输出应包含三行。
第一行应该有一个实数表示锥体的最大体积。
输出第二条线上锥体的高度和第三条线上锥体底部区域的半径。
所有实数都应该舍入到0.01。

样本输入

三十
样本输出

10.93
4.37
1.55
资源

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1 << 30;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-') op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
        x = x * 10 + c - '0';
    if(op) x = -x;
}
template <class T>
void write(T x)
{
    if(x < 0) putchar('-'), x = -x;
    if(x >= 10) write(x / 10);
    putchar('0' + x % 10);
}
db s,pi = acos(-1.0);
inline db calc(const db &r)
{
    db l = (s - r * r) / r;
    db h = sqrt(l * l - r * r);
    db v = pi * r * r * h / 3.0;
    return v;
}
int main()
{
    while(scanf("%lf",&s) != EOF)
    {
        s /= pi;
        db lft = 0,rgt = sqrt(s),m1,m2,r;
        duke(t,0,200)
        {
            m1 = lft + (rgt - lft) / 3.0;
            m2 = rgt - (rgt - lft) / 3.0;
            if(calc(m1) <= calc(m2))
            lft = m1,r = m2;
            else
            rgt = m2,r = m1;
        }
        db l = (s - r * r) / r;
        db h = sqrt(l * l - r * r);
        db v = pi * r * r * h / 3.0;
        printf("%.2f\n%.2f\n%.2f\n",v,h,r);
    }
    return 0;
}

 

posted @ 2018-10-13 19:42  DukeLv  阅读(350)  评论(0编辑  收藏  举报