传送带
题目描述
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段
输入格式
输入数据第一行是4个整数,表示
输出格式
输出数据为一行,表示lxhgww从A点走到
样例输入
0 0 0 100
100 0 100 100
2 2 1
样例输出
136.60
数据范围
对于30%的数据
1<=
1<=P,
对于100%的数据
1<=
1<=P,
题解
答案的路径就是先在
一段,于是就可以先三分在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.