1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 #include <cassert> 5 6 using namespace std; 7 8 int N; 9 double shipx[15], shipy[15]; 10 double vx[15], vy[15]; 11 double hx, hy, hs; 12 13 double intersect(double sx, double sy, double vx, double vy, 14 double hx, double hy) 15 { 16 // the location of ship at time t is (sx,sy) + t*(vx,vy) 17 // the distance from (hx,hy) to the ship at time t should be t*hs 18 // equate the two to arrive at a quadratic. 19 double dx = sx - hx, dy = sy - hy; 20 double a = vx*vx + vy*vy - hs*hs; 21 double b = 2*dx*vx + 2*dy*vy; 22 double c = dx*dx + dy*dy; 23 24 double disc = b*b - 4*a*c; 25 assert(disc >= 0); 26 double root1 = (-b + sqrt(disc))/(2*a); 27 double root2 = (-b - sqrt(disc))/(2*a); 28 //cout << disc << endl << root1 << endl << root2 << endl; 29 double root[2]; 30 int numroot = 0; 31 if (root1 >= 0) 32 { 33 root[numroot++] = root1; 34 } 35 if (root2 >= 0) 36 { 37 root[numroot++] = root2; 38 } 39 assert(numroot > 0); 40 return *min_element(root, root+numroot); 41 } 42 43 double compute(int perm[]) 44 { 45 double t = 0; 46 double currx = hx, curry = hy; // current location of helicopter 47 48 for (int i = 0; i < N; i++) 49 { 50 int ship = perm[i]; 51 double sx = shipx[ship] + vx[ship]*t; 52 double sy = shipy[ship] + vy[ship]*t; 53 54 t += intersect(sx, sy, vx[ship], vy[ship], currx, curry); 55 t += 3600; // 5 minutes to unload 56 currx = shipx[ship] + vx[ship]*t; 57 curry = shipy[ship] + vy[ship]*t; 58 } 59 60 t += hypot(currx - hx, curry - hy) / hs; 61 return t; 62 } 63 64 bool solve(int id) 65 { 66 //cout << "reading number of entries" << endl; 67 cin >> N; 68 //cout << "number of entries is " << N << endl; 69 if (!N) return false; 70 71 for (int i = 0; i < N; i++) 72 { 73 cin >> shipx[i] >> shipy[i] >> vx[i] >> vy[i]; 74 75 // convert to km/s 76 vx[i] /= 3600.0; 77 vy[i] /= 3600.0; 78 } 79 cin >> hx >> hy >> hs; 80 hs /= 3600.0; 81 82 int perm[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; 83 double best = -1; 84 do 85 { 86 double t = compute(perm); 87 if (best < 0 || t < best) 88 { 89 best = t; 90 } 91 } 92 while (next_permutation(perm, perm+N)); 93 94 long long int secs = (long long int)ceil(best); 95 cout << "Case " << id << ": " 96 << secs/3600 << " hour(s) " 97 << (secs%3600)/60 << " minute(s) " 98 << secs % 60 << " second(s)" << endl; 99 100 return true; 101 } 102 103 int main() 104 { 105 int id = 1; 106 while (solve(id++)) 107 ; 108 109 return 0; 110 } 111