【HDOJ】3400 Line belt
三分。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 5 typedef struct { 6 double x, y; 7 } Point_t; 8 9 Point_t A, B, C, D; 10 const double eps = 1.0e-8; 11 double P, Q, R; 12 13 double dist(Point_t a, Point_t b) { 14 return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); 15 } 16 17 double t_ab(Point_t a, Point_t b) { 18 return dist(a, b)/P; 19 } 20 21 double t_cd(Point_t c, Point_t d) { 22 return dist(c, d)/Q; 23 } 24 25 double t_oth(Point_t x, Point_t y) { 26 return dist(x, y)/R; 27 } 28 29 double tri_cd(Point_t c, Point_t d, Point_t S) { 30 Point_t left = c, right = d; 31 Point_t p1, p2; 32 33 while (dist(left, right) > eps) { 34 p1.x = left.x*2.0/3.0 + right.x/3.0; 35 p1.y = left.y*2.0/3.0 + right.y/3.0; 36 p2.x = left.x/3.0 + right.x*2.0/3.0; 37 p2.y = left.y/3.0 + right.y*2.0/3.0; 38 if (t_oth(S, p1)+t_cd(p1, D) <= t_oth(S, p2)+t_cd(p2, D)) { 39 right = p2; 40 } else { 41 left = p1; 42 } 43 } 44 return t_oth(S, left) + t_cd(left, d); 45 } 46 47 double tri_ab(Point_t a, Point_t b) { 48 Point_t left = a, right = b; 49 Point_t p1, p2; 50 51 while (dist(left, right) > eps) { 52 p1.x = left.x*2.0/3.0 + right.x/3.0; 53 p1.y = left.y*2.0/3.0 + right.y/3.0; 54 p2.x = left.x/3.0 + right.x*2.0/3.0; 55 p2.y = left.y/3.0 + right.y*2.0/3.0; 56 if (t_ab(a, p1)+tri_cd(C, D, p1) <= t_ab(a, p2)+tri_cd(C, D, p2)) { 57 right = p2; 58 } else { 59 left = p1; 60 } 61 } 62 return t_ab(a, left) + tri_cd(C, D, left); 63 } 64 65 int main() { 66 int t; 67 68 scanf("%d", &t); 69 while (t--) { 70 scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y); 71 scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y); 72 scanf("%lf%lf%lf", &P, &Q, &R); 73 printf("%.2lf\n", tri_ab(A, B)); 74 } 75 76 return 0; 77 }