传送带(三分)

在一个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 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/11255764.html