|
@@ -9,14 +9,44 @@ func main() {
|
|
|
fmt.Scan(&T)
|
|
|
for cid := 0; cid < T; cid++ {
|
|
|
fmt.Scan(&N)
|
|
|
+ // ********** This is the standard answer given by GCJ **********
|
|
|
// Assume that minimum energy is E, for each (xi, yi, zi),
|
|
|
// we have |x-xi| + |y-yi| + |z-zi| <= Epi, which is
|
|
|
// xi + yi + zi - Epi <= x + y + z <= Epi + xi + yi + zi
|
|
|
// xi - yi + zi - Epi <= x - y + z <= Epi + xi - yi + zi
|
|
|
// xi + yi - zi - Epi <= x + y - z <= Epi + xi + yi - zi
|
|
|
- // xi - yi - zi - Epi <= x - y - z <= Epi + xi - yi - zi
|
|
|
- for n := 0; n < N; n++ {
|
|
|
-
|
|
|
+ // yi + zi - xi - Epi <= y + z - x <= Epi - xi + yi + zi
|
|
|
+ // so 0 <= Epi. What's more,
|
|
|
+ // A - x <= y + z <= B - x, G + x <= y + z <= H + x,
|
|
|
+ // x - D <= y - z <= x - C, E - x <= y - z <= F - x
|
|
|
+ // if y and z is solvable, then [A-x, B-x] and [G+x, H+x] must
|
|
|
+ // intersect, [x-D, x-C] and [E-x, F-x] must intersect.
|
|
|
+ // For first two range, x in [(A-H)/2, (B-G)/2], for the second,
|
|
|
+ // x in [(E+C)/2, (F+D)/2]. So we just have to test if the two
|
|
|
+ // range intersects.
|
|
|
+ // ???
|
|
|
+ // **************************************************************
|
|
|
+ // In fact, the position of mother ship should be in the cuboid
|
|
|
+ // area between two of the ships. For ship A and ship B, we
|
|
|
+ // have: |x-xa|+|y-ya|+|z-za| = paE, |x-xb|+|y-yb|+|z-zb| = pbE;
|
|
|
+ // so dista + distb = (pa + pb)E, E = distab / (pa + pb)
|
|
|
+ // max E = max (distab/(pa+pb))
|
|
|
+ ships := make([][]int, N)
|
|
|
+ for i := 0; i < N; i++ {
|
|
|
+ ships[i] = make([]int, 4)
|
|
|
+ fmt.Scan(&ships[i][0], &ships[i][1], &ships[i][2], &ships[i][3])
|
|
|
+ }
|
|
|
+ maxPower := 0.
|
|
|
+ for i := 0; i < N; i++ {
|
|
|
+ for j := 0; j < N; j++ {
|
|
|
+ dist := abs(ships[i][0]-ships[j][0]) + abs(ships[i][1]-ships[j][1]) + abs(ships[i][2]-ships[j][2])
|
|
|
+ powerSum := ships[i][3] + ships[j][3]
|
|
|
+ power := float64(dist) / float64(powerSum)
|
|
|
+ if maxPower < power {
|
|
|
+ maxPower = power
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ fmt.Printf("Case #%d: %f\n", cid+1, maxPower)
|
|
|
}
|
|
|
}
|