HDu 3400 line belt(3点検索)

5125 ワード

#include<stdio.h>

#include<math.h>

#define eps 0.00000001

struct node

{

    double x,y;

}a,b,c,d;

double p,q,r;

void init()

{

    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);

}

double dist(node a,node b)

{

    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));

}

double scd(node p1,double m)

{

    node p2;

    p2.x=c.x+(d.x-c.x)*m;

    p2.y=c.y+(d.y-c.y)*m;

    return dist(p1,p2)/r+dist(d,p2)/q;

}

double solvecd(node p1)

{

    double l=0.0,r=1.0,mid,mmid,ans1,ans2;

    while(l+eps<r)

    {

        mid=(l+r)/2;

        mmid=(mid+r)/2;

        ans1=scd(p1,mid);

        ans2=scd(p1,mmid);

        if(ans1<ans2) r=mmid;

        else l=mid;

    }

    return scd(p1,l);

}

double sab(double m)

{

    node p1;

    p1.x=a.x+(b.x-a.x)*m;

    p1.y=a.y+(b.y-a.y)*m;

    return dist(a,p1)/p+solvecd(p1);

}

double solveab()

{

    double l=0.0,r=1.0,mid,mmid,ans1,ans2;

    while(l+eps<r)

    {

        mid=(l+r)/2;

        mmid=(mid+r)/2;

        ans1=sab(mid);

        ans2=sab(mmid);

        if(ans1<ans2) r=mmid;

        else l=mid;

    }

    return sab(l);

}

int main()

{

    int cs;scanf("%d",&cs);

    while(cs--)

    {

      init();

      double ans=solveab();

      printf("%.2f
",ans); } return 0; }