HDU-2289 Cup

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

const double eps = 1e-9;
const double pi = acos(-1.0);
double r1, r2, H, V;
int t;

inline double volume(double h)
{
    double R = h / H * (r2 - r1) + r1;
    double v = (r1*R + r1*r1 + R*R) * h * pi / 3;
    return v;
}
int main()
{
    while(cin >> t)
    {
        while(t--)
        {
           cin >> r1 >> r2 >> H >> V;
           double l = 0, r = 100;
           while(r - l > eps)
           {
               double mid = (r + l) / 2;
               double vm = volume(mid);
               if(vm >= V) r = mid;
               else l = mid;
           }
           printf("%.6f\n",r);
        }
    }


    return 0;
}

题意:输入t(杭电输入的一种习惯),之后输入一个水杯(圆台(上大下小))的 下底半径r1,上底半径r2,杯高度H,体积V。求水的高度。

题解:二分查找。现在做起来满简单的。一开始又犯了一个低级数学错误(直接把上底r2当成了水面的高度,想想怎么这么简单..看来是敲太久晕了)。求水面上底的半径R = h / H * (r2 - r1) + r1(相似比)。其他就很简单了。(可以r = mid或者r = mid - eps 都过)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值