HDU 2289 CUP 解题报告

来源:互联网 发布:windows美化大师 编辑:程序博客网 时间:2024/05/22 09:02




Hdu 2289 CUP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289
题目大意这道题就是给你一个圆台,里面装了一些水,现在告诉你圆台上下底半径,高度,水的体积,问你水的高度是多少。
思路数学题,利用二分求解,保证精度
             1.推导出高为h时的半径R1,用r,R,h,H表示,
             2.代到公式3*v/PI=h*(R1*R1+R1*r+r*r),课得到方程ah+bh^2+ch^3-s=0;
              其中,R1=r+(R-r)*h/H     a=3*H*H*r*r    b=3*H*r*(R-r)     c=(R-r)*(R-r)    s=3*V*H*H/PI
             3.用二分求解方程的根。
注意事项:如果把R=r即为圆柱时分离出来时要特别注意,因为double和float型的精度问题,基本没有绝对等于的情况

附上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<map>

#define N 100010
#define Mod 10000007
#define lson l,mid,idx<<1
#define rson mid+1,r,idx<<1|1
#define lc idx<<1
#define rc idx<<1|1
#define PI acos(-1.0)
typedef long long ll;

const int INF=1000010;

using namespace std;

double r, R, H, V,s,a,b,c;

bool C(double x)
{
return 3*H*H*r*r*x+3*H*r*(R-r)*x*x+(R-r)*(R-r)*x*x*x>=3*V*H*H/PI;
}
int main()
{
int t;
while(cin>>t)
{
while(t--)
{
scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
double left=0,right=100;
//double a=3*H*H*r*r,b=3*H*r*(R-r),c=(R-r)*(R-r),s=3*V*H*H/PI;考虑到精度问题,直接把表达式代入
for(int i=0; i<100; i++)///循环100次的精度为1e-30,已经够了
{
double mid=(left+right)/2;
if(C(mid))
right=mid;
else
left=mid;
}
printf("%.6f\n",right);
}
}
return 0;
}

0 0