在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间。
输入
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By
第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy
第三行是3个整数,分别是P,Q,R
1≤ Ax,Ay,Bx,By,Cx,Cy,Dx,Dy≤1000
1≤P,Q,R≤10
输出
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
样例输入
0 0 0 100
100 0 100 100
2 2 1
样例输出
136.60
解题思路: 现在AB线段上固定一个点 这样对CD段三分找最优解 然后对AB三分得到最终最优解; 三分套三分!

1 #include <bits/stdc++.h> 2 using namespace std; 3 double P,Q,R; 4 5 struct Node{ 6 double x,y; 7 }A,B,C,D; 8 9 Node X,Y; 10 11 double Sum(Node a,Node b){ //求两点之间的juli 12 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+1e-9); 13 } 14 15 double solve(double ax){ //x y+yd 的时间 16 Y.x=C.x+(D.x-C.x)*(ax/Sum(C,D)); 17 Y.y=C.y+(D.y-C.y)*(ax/Sum(C,D)); 18 return Sum(X,Y)*1.0/R+Sum(Y,D)*1.0/Q; 19 } 20 21 double Thren_CD(double x){ 22 X.x=A.x+(B.x-A.x)*(x/Sum(A,B)); 23 X.y=A.y+(B.y-A.y)*(x/Sum(A,B)); 24 double cd=Sum(C,D); 25 double left=0.0,right=cd; 26 double eps=1e-9; 27 double ans=1000000000; 28 while(left+eps<right){ 29 double midleft=left+(right-left)/3; 30 double midright=right-(right-left)/3; 31 double shu1=solve(midleft); 32 double shu2=solve(midright); 33 if(shu1<=shu2) right=midright; 34 else left=midleft; 35 ans=min(shu1,shu2); 36 } 37 return ans+x*1.0/P; 38 } 39 40 double Thren_AB(double left,double right){ 41 double eps=1e-9; 42 double res=1000000000; 43 while(left+eps<right){ 44 double midleft=left+(right-left)/3; 45 double midright=right-(right-left)/3; 46 double shu1=Thren_CD(midleft); //AB上固定的点到Y的距离+AX; 47 double shu2=Thren_CD(midright); 48 if(shu1<=shu2) right=midright; 49 else left=midleft; 50 // printf("%.4f%.4f ",shu1,shu2); 51 res=min(res,min(shu1,shu2)); 52 } 53 return res; 54 } 55 56 int main(){ 57 scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y); 58 scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y); 59 scanf("%lf%lf%lf",&P,&Q,&R); 60 // printf("%.4f %.4f %.4f %.4f ",A.x,A.y,B.x,B.y); 61 // printf("%.4f ",Sum(A,B)); 62 printf("%.2f ",Thren_AB(0.0,Sum(A,B))); ///对AB进行三分 63 return 0; 64 }