hdoj 3400 三分

两次三分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int x[5],y[5],v[5];

double cal(double x1,double x2,double y1,double y2)
{
    double tmp=(x1-x2)*(x1-x2);
    tmp+=(y1-y2)*(y1-y2);
    return sqrt(tmp);
}

double chk(double xx,double yy)
{
    double stx=x[3],sty=y[3],edx=x[4],edy=y[4];
    double txt1,txt2;
    while(1)
    {
            txt1=cal(xx,x[1],yy,y[1])/v[1]+cal(stx+(edx-stx)/3,x[4],sty+(edy-sty)/3,y[4])/v[2];
            txt1+=cal(xx,stx+(edx-stx)/3,yy,sty+(edy-sty)/3)/v[3];
            txt2=cal(xx,x[1],yy,y[1])/v[1]+cal(stx+(edx-stx)/3*2,x[4],sty+(edy-sty)/3*2,y[4])/v[2];
            txt2+=cal(xx,stx+(edx-stx)/3*2,yy,sty+(edy-sty)/3*2)/v[3];
            if(txt1<txt2)
            {
                edx=stx+(edx-stx)/3*2;
                edy=sty+(edy-sty)/3*2;
            }
            else
            {
                stx=stx+(edx-stx)/3;
                sty=sty+(edy-sty)/3;
            }
        if(fabs(txt1-txt2)<0.0001) break;
    }
    return txt1;
}


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        for(int i=1;i<=4;i++)
        scanf("%d %d",&x[i],&y[i]);
        for(int i=1;i<=3;i++)
        scanf("%d",&v[i]);
        double stx=x[1],sty=y[1],edx=x[2],edy=y[2];
        double txt1,txt2;
        while(1)
        {
            txt1=chk(stx+(edx-stx)/3,sty+(edy-sty)/3);
            txt2=chk(stx+(edx-stx)/3*2,sty+(edy-sty)/3*2);
            if(txt1<txt2)
            {
                edx=stx+(edx-stx)/3*2;
                edy=sty+(edy-sty)/3*2;
            }
            else
            {
                stx=stx+(edx-stx)/3; 
                sty=sty+(edy-sty)/3;
            }
            if(fabs(txt1-txt2)<0.0001) break;
        }
        printf("%.2f
",(txt1+txt2)/2);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/pangblog/p/3266505.html