POJ 3737 - UmBasketella(三分)

1 篇文章 0 订阅

题目链接

http://poj.org/problem?id=3737

题意

给出一个圆锥体的表面积,求出最大体积,要求精度1e-2

思路

推一下公式
S=πr2+πrr2+h2
于是推出:
h=S2π2r22Sπ
带入体积公式:
V=πr2h3=S2r22πSr43
可以看出 V r2先增大再减小,又因为 r>0 ,于是 V r先增大再减小,满足三分性质。

代码

C++能AC但是G++会WA

#include <iostream>
#include <cmath>
#include <stdio.h>

using namespace std;

inline int in() {int x; scanf("%d", &x); return x;}
#define pr(x) {cout << #x << ' ' << x << endl;}

#define pi (3.141592653589793)
double S;

double value(double r) {
    return sqrt(S * S * r * r - 2 * pi * S * r * r * r * r) / 3.0;
}

int main() {
    while (scanf("%lf", &S) != EOF) {
        double R, l = 0, r = sqrt(S / (2 * pi)), m;
        while (r - l > 1e-6) {
            double mid1 = l + (r - l) / 3.0;
            double mid2 = r - (r - l) / 3.0;
            if (value(mid1) > value(mid2)) {
                r = mid2;
            } else {
                l = mid1;
            }
        }
        double h = sqrt((S * S / (pi * pi * r * r)) - (2 * S / pi));
        double v = pi * r * r * h / 3.0;
        printf("%.2lf\n%.2lf\n%.2lf\n", v, h, r);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值