Asakura的魔法世界

Font Size:Aa Aa Aa

Description

Asakura存在于一个魔法世界中。有一天,Asakura在一条魔法通道里偷懒,突然接到一个紧急任务,要快速赶往另一条通道b去。
我们把通道a和b看作两条线段AB和CD,Asakura初始位置在A,现在要快速赶往D。Asakura在魔法通道a上的速度为v1,在魔法通道b上速度为v2,在除了这两条通道上的其余位置的速度为v3。Asakura最快多长时间才能到达指定位置。

Input

多组输入
对于每组测试数据:包含三行
第一行输入四个整数x1,y1,x2,y2.其中(x1,y1)为A,(x2,y2)为B.(-10000<=x1,y1,x2,y2<=10000)
第二行输入四个整数x3,y3,x4,y4.其中(x3,y3)为C,(x4,y4)为D.(-10000<=x3,y3,x4,y4<=10000)
第三行输入三个整数v1,v2,v3.(1<=v1,v2,v3<=50)
每两组测试数据间输入一个空行。

Output

输出A到D最短的时间,结果精度到小数点后两位(四舍五入)。

Sample Input

0 0 50 50
50 0 50 50
1 1 1

0 0 50 50
50 0 50 50
3 1 3

0 0 50 50
50 0 50 50
1 3 1

Sample Output

70.71
23.57
63.81
 

 

 

代码如下:

#include<cstdio>

#include<cmath>

doubledis(double x1, double y1,double x2, double y2)

{

    returnsqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));

}

doublev1, v2, v3, x[4], y[4];

doublemindis(doublexi, double yi)

{

    doublei = x[3] - x[2];

    doublej = y[3] - y[2];

    doublel = 0, r = 1;

    intt;

    doubletmid, tmidmid;

    for(t = 1; t <= 50; t++)

    {

        doublemid = (l + r) / 2;

        doublemidmid = (mid + r) / 2;

        doublemidx = x[2] + mid*i;

        doublemidy = y[2] + mid*j;

        doublemidmidx = x[2] + midmid*i;

        doublemidmidy = y[2] + midmid*j;

        tmid = dis(xi, yi, midx, midy) / v3 + dis(midx, midy, x[3], y[3]) / v2;

        tmidmid = dis(xi, yi, midmidx, midmidy) / v3 + dis(midmidx, midmidy, x[3], y[3]) / v2;

        if(tmid > tmidmid)

            l = mid;

        elser = midmid;

    }

    returntmidmid;

}

int main()

{

    while(~scanf("%lf %lf %lf %lf", &x[0], &y[0], &x[1], &y[1]))

    {

        scanf("%lf %lf %lf %lf", &x[2], &y[2], &x[3], &y[3]);

        scanf("%lf %lf %lf", &v1, &v2, &v3);

        doublei = x[1] - x[0];

        doublej = y[1] - y[0];

        doublel = 0, r = 1;

        intt;

        doubletmid, tmidmid;

        for(t = 1; t <= 50; t++)

        {

            doublemid = (l + r) / 2;

            doublemidmid = (mid + r) / 2;

            doublemidx = x[0] + mid*i;

            doublemidy = y[0] + mid*j;

            doublemidmidx = x[0] + midmid*i;

            doublemidmidy = y[0] + midmid*j;

            tmid = dis(x[0], y[0], midx, midy) / v1 + mindis(midx, midy);

            tmidmid = dis(x[0], y[0], midmidx, midmidy) / v1 + mindis(midmidx, midmidy);

            if(tmid > tmidmid)

                l = mid;

            elser = midmid;

        }

        printf("%.2lf\n", tmid);

    }

    return0;

}

更多做题心得的详情请查看(记得关注哦)https://mp.weixin.qq.com/s?__biz=MzIyOTM4MDMxNw==&mid=2247483798&idx=1&sn=d4fbd34e50ce4efda39d7710d2dc5dc9&chksm=e842d824df3551320d7f1ed85286b2616aec419f7a852cc5c9c9f270beb237b5e6ca83166162&token=1630951018&lang=zh_CN#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值