注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

告别迷茫

梦想与现实的差距,就是我们生活的意义。因为我们有差距,我们才会一直积累,在努力。

 
 
 

日志

 
 

HDU2289 CUP  

2014-04-26 23:40:16|  分类: 搜索的入门 二分 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

二分

题目大意:一个圆台型的杯子,告诉杯子的上底和下底的半径、杯子的高度,以及水的体积,要求水的高度。
算法分析:

/*
水平面的半径u可以根据直角梯形的面积求出:
(r+u)*h + (u+R)*(H-h) = (r+R)*H
得出(R-r)*h = (u-r)*H
得 u = r + (R-r)*h/H
圆台体积计算公式:V= π*h*( R^2 + R*u + u^2 ) / 3
*/






Problem Description

The WHU ACM Team has a big cup, with which every member
drinks water. Now, we know the volume of the water in the cup, can you tell us
it height?

The radius of the cup's top and bottom circle is known, the
cup's height is also known.

 


Input

The input consists of several test cases. The first
line of input contains an integer T, indicating the num of test cases.
Each
test case is on a single line, and it consists of four floating point numbers:
r, R, H, V, representing the bottom radius, the top radius, the height and the
volume of the hot water.

Technical Specification

1. T ≤ 20.
2.
1 ≤ r, R, H ≤ 100; 0 ≤ V ≤ 1000,000,000.
3. r ≤ R.
4. r, R, H, V are
separated by ONE whitespace.
5. There is NO empty line between two
neighboring cases.


 


Output

For each test case, output the height of hot water on a
single line. Please round it to six fractional digits.

 


Sample Input

1
100 100 100 3141562

 


Sample Output

99.999024

 


Source


 


Recommend

lcy   |   We have carefully selected several similar
problems for you:  2141 1551 1399 2446 3400 

 


Statistic | Submit | Discuss | Note





Home | TopHangzhou
Dianzi University Online Judge 3.0
Copyright ? 2005-2014 HDU ACM Team. All Rights

#include<stdio.h>
#include<math.h>
double r, R, H, V;
double volume( double h )/*虽然这个具体的高度我们不知到,但是我们可以通过不断地与V的比较,进行二分,这个在一个确定的
范围中的,体会到了二分的强大,真的没有我们想的那么简单啊*/
{
double u = r + ( R- r ) * h / H;
return ( 3.1415926535897932384626433832795* h * (u* u + r * u + r * r) / 3.0 );
}
double erfen(double bottom,double top)
{
double mid;
while(top-bottom>1e-10)
{
mid=(top+bottom)/2;
if(volume(mid)>V)
{
top=mid-1e-11;
}
else
{
bottom=mid+1e-11;
}
}
return (bottom+top)/2;
}


int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf %lf %lf %lf", &r, &R, &H, &V);
printf("%.6lf\n",erfen(0,H));
}
return 0;

}


  评论这张
 
阅读(7)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017