hdoj 3400 Line belt (三分嵌套搜索 )

Line belt

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


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
 

AB线段上找一点p,CD线段上找一点q,使Ap-->pq-->qD路线的耗时最短。

直接写函数写不出来,由于是找最小值,三分搜索在两条线段上无限逼近答案p,q 两点。

code

#include <iostream>
#include<cstdio>
#include <cmath>
using namespace std;
#define eps 1e-10;
struct Node
{
    double x,y;
};
Node A,B,C,D;
double Q,P,R;
double cost(Node a,Node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double f(Node p,Node c,Node d)
{
    Node l,r,mid,midmid;
    l=c;r=d;
    while(cost(l,r)>=1e-10)
    {
        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;
        if(cost(p,mid)/R+cost(mid,d)/Q<cost(p,midmid)/R+cost(midmid,d)/Q)
            r=midmid;
        else
            l=mid;
    }
    return cost(p,mid)/R+cost(mid,d)/Q;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);
        scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y);
        scanf("%lf%lf%lf",&P,&Q,&R);
        Node l,r,mid,midmid;
        l=A;r=B;
        while(cost(l,r)>=1e-10)
        {
            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;
            if(cost(A,mid)/P+f(mid,C,D)<cost(A,midmid)/P+f(midmid,C,D))//三分的嵌套
                r=midmid;
            else
                l=mid;
        }
        printf("%.2lf\n",cost(A,mid)/P+f(mid,C,D));

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值