SCOI2010 Day2 传送带

    xiaoxiao2025-06-07  19

    传送带

    题目描述

    在一个 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
    最新回复(0)