SCOI2010 Day2 传送带

传送带

题目描述

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CDlxhgwwAB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间。

输入格式

输入数据第一行是4个整数,表示AB的坐标,分别为AxAyBxBy 第二行是4个整数,表示CD的坐标,分别为CxCyDxDy 第三行是3个整数,分别是PQR

输出格式

输出数据为一行,表示lxhgwwA点走到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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值