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;
}
#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
- HDU 2289 CUP 解题报告
- HDU 3342 解题报告
- HDU 3336 解题报告
- HDU 3335 解题报告
- hdu 2516解题报告
- hdu 1004解题报告
- hdu 2139解题报告
- hdu 1019解题报告
- hdu 1064 解题报告
- HDU 1113 解题报告
- hdu 1068 解题报告
- HDU:2050解题报告
- hdu 4001解题报告
- hdu 1005解题报告
- HDU解题报告--1003
- HDU解题报告--1004
- HDU解题报告--1005
- HDU 1005 解题报告
- 发的回复该减肥减肥国家法规
- randoop研究
- mount Windows文件夹在Linux上
- mysql tinyint 分析
- [水]ZOJ1577
- HDU 2289 CUP 解题报告
- android shape的使用
- 栈的颠倒算法 递归实现
- Girls and Boys(二分图匹配)
- codeforce 20140808 C. Boredom
- poj 2774 最长公共子串--字符串hash或者后缀数组或者后缀自动机
- 缓存算法
- 常用的正则查找表达式
- 防止基本的web安全问题的方法与介绍