飞机最短里程

题意:给定A,B,C,D四点坐标,以及由A到B,由C到D,其余路程的速度P,Q,R.,求出飞机从A到D的最小时间。

思路:先求出各点之间的距离,每段路程除以相应时间,用三分法求出在那个点转向所用时间最短。

感悟:这道题主要是判断在哪的地方转向,思路好想,代码写起来麻烦。

AC代码:

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
struct point
{
    double x,y;
}a,b,c,d;
double v1,v2,v3;
double f (point a,point b)
{
    return sqrt ((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
point mp (point a,point b)
{
    point m;
    m.x=(a.x+b.x)/2;
    m.y=(a.y+b.y)/2;
    return m;
}
double sf1(point m)
{
    point mid,mm,l,r;
    l=c;
    r=d;
    double t1=0,t2=100;
    while (fabs(t2-t1)>0.000001)
    {
        mid=mp(l,r);
        mm=mp(mid,r);
        t1=f(m,mid)/v3+f(mid,d)/v2;
        t2=f(m,mm)/v3+f(mm,d)/v2;
        if (t1>t2)
        l=mid;
        else
        r=mm;
    }
    return t1;
}
double sf ()
{
   point mid,mm,l,r;
    l=a;
    r=b;
    double t1=0,t2=100;
    while (fabs(t2-t1)>0.000001)
    {
        mid=mp(l,r);
        mm=mp(mid,r);
        t1=f(mid,a)/v1+sf1(mid);
        t2=f(mm,a)/v1+sf1(mm);
        if (t1>t2)
        l=mid;
        else
        r=mm;
    }
    return t1;
}
int main()
{
    int T;
    cin>>T;
    while (T--)
    {
        cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y>>v1>>v2>>v3;
cout<<fixed<<setprecision(2)<<sf()<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值