2014-10-06 20:43:27
思路:给这题跪了。。推了好久- = 数学太渣。
学到了一个重要的公式(其实自己推推也很快出来的):球冠公式:pi * h^2 * (3R - h) / 3,R为球的半径,h为球冠的高。
1 /************************************************************************* 2 > File Name: 1003.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Sun 05 Oct 2014 06:54:51 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <queue> 16 #include <iostream> 17 #include <algorithm> 18 using namespace std; 19 #define lp (p << 1) 20 #define rp (p << 1|1) 21 #define getmid(l,r) (l + (r - l) / 2) 22 #define MP(a,b) make_pair(a,b) 23 typedef long long ll; 24 const int INF = 1 << 30; 25 const double PI = acos(-1.0); 26 27 double R,HR,HZ; 28 double v1,v2,vi,t,d,vsum; 29 30 int main(){ 31 while(scanf("%lf%lf%lf",&R,&HR,&HZ) != EOF){ 32 v1 = 4.0 * PI * R * R * R / 3.0; 33 v2 = PI * HR * HR * 2.0 * HZ; 34 d = HR * HR + HZ * HZ; 35 vsum = v1 + v2; 36 if(HZ >= R && HR >= R){ 37 printf("%.6f\n",v1 / v2); 38 } 39 else if(d <= R * R){ 40 printf("%.6f\n",v2 / v1); 41 } 42 else if(HZ < R && HR > R){ 43 vi = 2.0 * PI * R * R * HZ - 2.0 * PI * HZ * HZ * HZ / 3.0; 44 printf("%.6f\n",vi / (vsum - vi)); 45 } 46 else if(HZ > R && HR < R){ 47 t = sqrt(R * R - HR * HR); 48 vi = 4.0 * PI * (R * R * R - t * t * t) / 3.0; 49 printf("%.6f\n",vi / (vsum - vi)); 50 } 51 else{ 52 t = sqrt(R * R - HR * HR); 53 vi = 4.0 * PI * (R * R * R - t * t * t) / 3.0; 54 vi -= 2 * PI * (R - HZ) * (R - HZ) * (R - (R - HZ) / 3.0); 55 printf("%.6f\n",vi / (vsum - vi)); 56 } 57 } 58 return 0; 59 }