[POJ3737]UmBasketella(三分法)

题目描述

传送门

题解

三分法
设圆锥底面半径为r,高为h
V=(s22sπr2)r2 ,类似于一个关于r的二次函数单峰
三分r
计算 h=s22sπrπ2r2

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

const double pi=acos(-1.0);
const double eps=1e-6;
int dcmp(double x)
{
    if (x<=eps&&x>=-eps) return 0;
    return (x>0)?1:-1;
}
double s,r,h,v;

double calc(double r)
{
    double h=sqrt((s*s-2*s*pi*r*r)/(pi*pi*r*r));
    return (1.0/3.0)*pi*r*r*h;
}
double find()
{
    double l=0,r=sqrt(s/pi),mid1,mid2,ans;
    while (dcmp(r-l)>0)
    {
        mid1=l+(r-l)/3.0;
        mid2=r-(r-l)/3.0;
        if (calc(mid1)<=calc(mid2)) ans=mid2,l=mid1;
        else r=mid2;
    }
    return ans;
}
int main()
{
    while (~scanf("%lf",&s))
    {
        r=find();
        h=sqrt((s*s-2*s*pi*r*r)/(pi*pi*r*r));
        v=calc(r);
        printf("%.2lf\n%.2lf\n%.2lf\n",v,h,r);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值