zoukankan      html  css  js  c++  java
  • 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
    %.2f
    %.2f
    ",v,h,r);
        }
        return 0;
    }
  • 相关阅读:
    利用“通过'反射方式'创建的对象”来创建对象的性能问题?
    Linq 学习笔记(一)
    说说数据类型转换帮助类
    使用公共静态属性的方式来代替公共静态字段(C#)
    支持差异数据保存的数据库实体类设计(二)(续)
    编程杂记
    Linq 学习笔记(二)
    UI版本WinDBG常用命令
    Oracle数据库卸载
    SAS框架问世
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9783890.html
Copyright © 2011-2022 走看看