传送带
题目描述
在一个
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。
输出格式
输出数据为一行,表示
lxhgww
从
A
点走到D点的最短时间,保留到小数点后
2
位。
样例输入
0 0 0 100
100 0 100 100
2 2 1
样例输出
136.60
数据范围
对于30%的数据
1<=Ax,
Ay
,
Bx
,
By
,
Cx
,
Cy
,
Dx
,
Dy
<=10 1<=
P
,Q,
R
<=5
对于100%的数据
1<=Ax,
Ay
,
Bx
,
By
,
Cx
,
Cy
,
Dx
,
Dy
<=1000 1<=
P
,Q,
R
<=10
题解
答案的路径就是先在AB上走,然后走到
CD
的一点,再走完剩下的 一段,于是就可以先三分在
AB
上的转折点,套个三分来三分
CD
上的转折点, 然后直接算就好了。
当然,我们看到“保留到小数点后两位”这里,所以,我们可以暴力枚举
AB
上的点,间距为
0.01
(理论上可以是
0.1
的,我没试过),然后再三分
CD
上的转折点即可。
Code(Pascal)
const
zd=
100000;
var
i:longint;
ans,P,Q,R,ax,ay,bx,by,zt,jl,xc,yc,cx,cy,dx,dy,n1x,n1y:extended;
function dis(a,b,c,d:extended):extended;
begin
exit(sqrt(sqr(a-c)+sqr(b-d)));
end;
function min(a,b:extended):extended;
begin
if a<b then exit(a)
else exit(b);
end;
function js(x,y:extended):extended;
var
lx,ly,rx,ry,k1x,k1y,k2x,k2y,di1,di2,jl:extended;
begin
lx:=cx;
ly:=cy;
rx:=dx;
ry:=dy;
jl:=zt;
while jl>=
0.001 do
begin
k1x:=lx+(jl/
3/zt)*xc;
k1y:=ly+(jl/
3/zt)*yc;
k2x:=lx+(jl/
3*
2/zt)*xc;
k2y:=ly+(jl/
3*
2/zt)*yc;
di1:=dis(x,y,k1x,k1y)/R+dis(k1x,k1y,dx,dy)/Q;
di2:=dis(x,y,k2x,k2y)/R+dis(k2x,k2y,dx,dy)/Q;
if di1>di2 then
begin
lx:=k1x;
ly:=k1y;
end
else
begin
rx:=k2x;
ry:=k2y;
end;
jl:=jl/
3*
2;
end;
js:=dis(x,y,lx,ly)/R+dis(lx,ly,dx,dy)/Q;
end;
begin
readln(ax,ay,bx,by);
readln(cx,cy,dx,dy);
readln(P,Q,R);
zt:=sqrt(sqr(dx-cx)+sqr(dy-cy));
xc:=dx-cx;
yc:=dy-cy;
ans:=
100000000;
for i:=
1 to zd
do
begin
n1x:=(bx-ax)/zd*i+ax;
n1y:=(by-ay)/zd*i+ay;
ans:=min(ans,js(n1x,n1y)+dis(ax,ay,n1x,n1y)/p);
end;
ans:=min(ans,js(ax,ay));
writeln(ans:
0:
2);
end.
转载请注明原文地址: https://ju.6miu.com/read-1299690.html