Description
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间
Input
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R
Output
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
Sample Input
0 0 0 100
100 0 100 100
2 2 1
100 0 100 100
2 2 1
Sample Output
136.60
HINT
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
题解
三分套三分。只要“三分”两条线段分别在哪里离开即可。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define eps 1e-12
using namespace std;
double P,Q,R;
struct dian {double x,y;} A,B,C,D;
void read(dian &a) {scanf("%lf%lf",&a.x,&a.y);}
double dis(dian &i,dian &j)
{
return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));
}
double calcu(double x,double y)
{
dian E,F;
E.x=x; E.y=y;
double lx=C.x,ly=C.y,rx=D.x,ry=D.y;
double m1x,m1y,m2x,m2y,t1,t2;
while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
{m1x=lx+(rx-lx)/3; m1y=ly+(ry-ly)/3;
m2x=rx-(rx-lx)/3; m2y=ry-(ry-ly)/3;
F.x=m1x; F.y=m1y;
t1=dis(A,E)/P+dis(E,F)/R+dis(F,D)/Q;
F.x=m2x; F.y=m2y;
t2=dis(A,E)/P+dis(E,F)/R+dis(F,D)/Q;
if(t1>t2) {lx=m1x;ly=m1y;}
else {rx=m2x;ry=m2y;}
}
F.x=lx; F.y=ly;
return dis(A,E)/P+dis(E,F)/R+dis(F,D)/Q;
}
int main()
{
read(A); read(B); read(C); read(D);
scanf("%lf%lf%lf",&P,&Q,&R);
double lx=A.x,ly=A.y,rx=B.x,ry=B.y;
double m1x,m1y,m2x,m2y,s1,s2;
while(fabs(rx-lx)>eps||fabs(ry-ly)>eps)
{m1x=lx+(rx-lx)/3; m1y=ly+(ry-ly)/3;
m2x=rx-(rx-lx)/3; m2y=ry-(ry-ly)/3;
s1=calcu(m1x,m1y); s2=calcu(m2x,m2y);
if(s1>s2) {lx=m1x; ly=m1y;}
else {rx=m2x; ry=m2y;}
}
printf("%.2lf",calcu(lx,ly));
return 0;
}