杭电 3400 Line belt 解题报告

    好玩的题。ABCD四点,三分法嵌套三分法。看代码应该更清晰一点~

#include<iostream>
#include<cmath>
using namespace std;

const double eps=1e-7;
double p,q,r;

struct Point
{
    double x,y;
} A,B,C,D;

double getDistance(Point a,Point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double cToD(Point a)
{
    Point midl,midr;
    Point left=C,right=D;
    while(fabs(left.x-right.x)>eps||fabs(left.y-right.y)>eps)
    {
        midl.x=(right.x+left.x*2)/3;
        midl.y=(right.y+left.y*2)/3;
        midr.x=(right.x*2+left.x)/3;
        midr.y=(right.y*2+left.y)/3;
        if(getDistance(a,midl)/r+getDistance(D,midl)/q<getDistance(a,midr)/r+getDistance(D,midr)/q)
            right=midr;
        else
            left=midl;
    }
    return getDistance(a,left)/r+getDistance(D,left)/q;
}

double aToD()
{
    Point midl,midr;
    Point left=A,right=B;
    while(fabs(left.x-right.x)>eps||fabs(left.y-right.y)>eps)
    {
        midl.x=(right.x+left.x*2)/3;
        midl.y=(right.y+left.y*2)/3;
        midr.x=(right.x*2+left.x)/3;
        midr.y=(right.y*2+left.y)/3;
        if(getDistance(A,midl)/p+cToD(midl)<getDistance(A,midr)/p+cToD(midr))
            right=midr;
        else
            left=midl;
    }
    return getDistance(A,left)/p+cToD(left);
}

int main()
{
    int cas;
    cin>>cas;
    while(cas--)
    {
        cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y>>p>>q>>r;
        printf("%.2lf\n",aToD());
    }
}

 

posted @ 2013-02-16 20:33  SF-_-  阅读(193)  评论(0编辑  收藏  举报