HDU 3400 Line belt 三分

Line belt

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2615    Accepted Submission(s): 990


Problem Description
In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the speed R on other area on the plane.
How long must he take to travel from A to D?
 

Input
The first line is the case number T.
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
 

Output
The minimum time to travel from A to D, round to two decimals.
 

Sample Input
   
1 0 0 0 100 100 0 100 100 2 2 1
 

Sample Output
   
136.60
 

Author
lxhgww&&momodi

在二维平面上,有两条线段分别是AB和CD,传送带在AB上的速度是p,在CD上的速度是q,在其余地方的速度是r,求传送带从A点到D点的最快时间是多少。
三分求解。
先三分AB这条线段,然后在此基础上在三分CD这条线段,最后即可求得最少时间。
//15MS	228K
#include<stdio.h>
#include<math.h>
double p,q,rr;
struct Point
{
    double  x,y;
};
double dis(Point A,Point B)
{
    return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));
}
double calc(Point x,Point C,Point D)
{
    Point l=C,r=D,mid,midmid;
    double mid_area,midmid_area;
    do//三分CD的长度
    {
        mid.x=(l.x+r.x)/2;mid.y=(l.y+r.y)/2;
        midmid.x=(mid.x+r.x)/2;midmid.y=(mid.y+r.y)/2;
        mid_area=dis(mid,D)/q+dis(x,mid)/rr;
        midmid_area=dis(midmid,D)/q+dis(x,midmid)/rr;
        if(mid_area>midmid_area)l=mid;
        else r=midmid;
    }while(dis(l,r)>=1e-9);
    return mid_area;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        Point A,B,C,D;
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&D.x,&D.y);
        scanf("%lf%lf%lf",&p,&q,&rr);
        Point l=A,r=B,mid,midmid;
        double mid_area,midmid_area;
        do//三分AB的长度
        {
            mid.x=(r.x+l.x)/2;mid.y=(r.y+l.y)/2;
            midmid.x=(r.x+mid.x)/2;midmid.y=(r.y+mid.y)/2;
            mid_area=dis(A,mid)/p+calc(mid,C,D);
            midmid_area=dis(A,midmid)/p+calc(midmid,C,D);
            if(mid_area<midmid_area)r=midmid;
            else l=mid;
        }while(dis(l,r)>=1e-9);
        printf("%.2lf\n",mid_area);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值