Three points.
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 }
[Hdoj] 3400 line belt