hdu2289 Cup

题目大意:这道题就是给你一个圆台,里面装了一些水,现在告诉你圆台上下底半径,高度,水的体积,问你水的高度是多少。

这道题可以二分搜索也可以计算几何,现在是计算几何的算法

 1 /*
 2 计算几何
 3 本题可以用数学解法,也可以用2分搜索,但用数学方法解效率更高。
 4 数学方法:cup的形状可能有两种,圆柱型,或是上大下小的圆台型。
 5 如果是圆柱形则直接用体积除以底面积即得出高;
 6 如果是圆台型,可以将圆台下边补全成为一个圆锥体,求出补全那部分的体积,
 7 按照比例关系体积之比是高之比的3次方。
 8 */
 9 #include <iostream>
10 #include <stdio.h>
11 #include <string.h>
12 #include <math.h>
13 using namespace std;
14 const double pi=acos(-1.0);
15 int main()
16 {
17     int t;
18     double r,R,H,v;
19     double h;
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%lf%lf%lf%lf",&r,&R,&H,&v);
24         if(r==R)
25             h=v/(pi*r*r);
26         else
27         {
28             double h0=(r*H)/(R-r);//补全的小圆锥的高 根据R/(H+h0)=r/h0求出
29             double v0=(pi*h0*r*r)/3;//补全的那个小圆锥的体积
30             h=h0*pow((v0+v)/v0,1.0/3)-h0;//根据公式:((v0+v)/v0)^(1/3) = (h+h0)/h0 求出 h
31         }
32         if(h>H)
33             h=H;//注意,如果水的体积大于杯子的体积那么求出的h将大于H,此时最大的h应该为杯子子的高度。
34         printf("%.6lf\n",h);
35     }
36     return 0;
37 }

 

 

posted on 2013-05-29 15:43  行者1992  阅读(313)  评论(0编辑  收藏  举报