ZOJ 3913 Bob wants to pour water ZOJ Monthly, October 2015 - H
There is a huge cubiod house with infinite height. And there are some spheres and some cuboids in the house. They do not intersect with others and the house. The space inside the house and outside the cuboids and the spheres can contain water.
Bob wants to know when he pours some water into this house, what's the height of the water level based on the house's undersurface.
Input
The first line is a integer T (1 ≤ T ≤ 50), the number of cases.
For each case:
The first line contains 3 floats w, l (0 < w, l < 100000), the width and length of the house, v (0 < v < 1013), the volume of the poured water, and 2 integers, m (1 ≤ m ≤ 100000), the number of the cuboids, n (1 ≤ n ≤ 100000), the number of the spheres.
The next m lines describe the position and the size of the cuboids.
Each line contains z (0 < z < 100000), the height of the center of each cuboid, a (0 < a < w), b (0 < b < l), c, the width, length, height of each cuboid.
The next n lines describe the position and the size of the spheres, all these numbers are double.
Each line contains z (0 < z < 100000), the height of the center of each sphere, r (0 < 2r < w and 2r < l), the radius of each sphere.
Output
For each case, output the height of the water level in a single line. An answer with absolute error less than 1e-4 or relative error less than 1e-6 will be accepted. There're T lines in total.
Sample Input
1 1 1 1 1 1 1.5 0.2 0.3 0.4 0.5 0.5
Sample Output
1.537869
Author: YANG, Xinyu; ZHAO, Yueqi
题意:给出一个长为l,宽为w,无限高的长方体,这个长方体,然后给出若干的球或长方体,给出它们的各种参数(包括高度),所有的球和长方体都是不重叠的(废话)
问导入v的体积的水,问水面高度多少。
分析:根据数据范围显然是一道二分水面高度,暴力验证的题目
算球的缺体的公式可以用球面锥的面积(指在球面那部分的面积)与球面面积的比减去圆锥的体积得到
球面锥的面积:2piRH,H为半径减去球心到圆锥地面的距离
没什么trick
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <deque> 6 #include <vector> 7 #include <queue> 8 #include <iostream> 9 #include <algorithm> 10 #include <map> 11 #include <set> 12 #include <ctime> 13 using namespace std; 14 typedef long long LL; 15 typedef double DB; 16 #define For(i, s, t) for(int i = (s); i <= (t); i++) 17 #define Ford(i, s, t) for(int i = (s); i >= (t); i--) 18 #define Rep(i, t) for(int i = (0); i < (t); i++) 19 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) 20 #define rep(i, x, t) for(int i = (x); i < (t); i++) 21 #define MIT (2147483647) 22 #define INF (1000000001) 23 #define MLL (1000000000000000001LL) 24 #define sz(x) ((int) (x).size()) 25 #define clr(x, y) memset(x, y, sizeof(x)) 26 #define puf push_front 27 #define pub push_back 28 #define pof pop_front 29 #define pob pop_back 30 #define ft first 31 #define sd second 32 #define mk make_pair 33 inline void SetIO(string Name) { 34 string Input = Name+".in", 35 Output = Name+".out"; 36 freopen(Input.c_str(), "r", stdin), 37 freopen(Output.c_str(), "w", stdout); 38 } 39 40 inline int Getint() { 41 int Ret = 0; 42 char Ch = ' '; 43 while(!(Ch >= '0' && Ch <= '9')) Ch = getchar(); 44 while(Ch >= '0' && Ch <= '9') { 45 Ret = Ret*10+Ch-'0'; 46 Ch = getchar(); 47 } 48 return Ret; 49 } 50 51 const int N = 100010; 52 const DB pi = acos(-1.0), Eps = 1e-7; 53 struct Sphere { 54 DB High, R; 55 56 inline void Read() { 57 scanf("%lf%lf", &High, &R); 58 } 59 60 inline DB Calc(DB H) { 61 DB D = min(2*R, max(0.0, H-High+R)), Ret; 62 Ret = pi*(R*D*D-D*D*D/3); 63 return Ret; 64 } 65 } S[N]; 66 struct Cube { 67 DB High, Width, Length, Height; 68 69 inline void Read() { 70 scanf("%lf%lf%lf%lf", &High, &Width, &Length, &Height); 71 } 72 73 inline DB Calc(DB H) { 74 DB D = min(Height, max(0.0, H-High+Height/2.0)), Ret; 75 Ret = Width*Length*D; 76 return Ret; 77 } 78 } C[N]; 79 int n, m; 80 DB Width, Length, V, Ans; 81 82 inline void Solve(); 83 84 inline void Input() { 85 int TestNumber; 86 scanf("%d", &TestNumber); 87 while(TestNumber--) { 88 scanf("%lf%lf%lf%d%d", &Width, &Length, &V, &n, &m); 89 For(i, 1, n) C[i].Read(); 90 For(i, 1, m) S[i].Read(); 91 Solve(); 92 } 93 } 94 95 inline DB Calc(DB H) { 96 DB Ret = Width*Length*H; 97 For(i, 1, n) Ret -= C[i].Calc(H); 98 For(i, 1, m) Ret -= S[i].Calc(H); 99 return Ret; 100 } 101 102 inline DB Work() { 103 DB Left = 0, Right = 1.0*INF, Mid, TmpV; 104 while(Right-Left >= Eps) { 105 Mid = (Right+Left)/2.0; 106 TmpV = Calc(Mid); 107 if(TmpV+Eps >= V) Right = Mid; 108 else Left = Mid; 109 } 110 return Right; 111 } 112 113 inline void Solve() { 114 Ans = Work(); 115 printf("%.6lf\n", Ans); 116 } 117 118 int main() { 119 #ifndef ONLINE_JUDGE 120 SetIO("K"); 121 #endif 122 Input(); 123 //Solve(); 124 return 0; 125 }