您的位置:首页 > 其它

HDU-2289 Cup

2015-07-26 20:47 399 查看
#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 都过)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: