【题解】LibreOJ10017(同洛谷P2571/bzoj1857)[SCOI2010]传送带 三分

题目链接
这里写图片描述
这里写图片描述


如果固定了一个点,另一个点可以三分。所以我们就三分套一个三分

#include<cstdio>
#include<cmath>
const double eps=1e-8;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double get(double xa,double ya,double xb,double yb)
{
    return sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
}
double cal(double x,double y)
{
    double lx=cx,ly=cy,rx=dx,ry=dy,lmx,lmy,rmx,rmy,t1,t2;
    while(fabs(lx-rx)>eps||fabs(ly-ry)>eps)
    {
        lmx=lx+(rx-lx)/3;
        lmy=ly+(ry-ly)/3;
        rmx=rx-(rx-lx)/3;
        rmy=ry-(ry-ly)/3;
        t1=get(dx,dy,lmx,lmy)/q+get(x,y,lmx,lmy)/r;
        t2=get(dx,dy,rmx,rmy)/q+get(x,y,rmx,rmy)/r;
        if(t1>t2)lx=lmx,ly=lmy;
        else rx=rmx,ry=rmy;
    }
    return get(ax,ay,x,y)/p+get(dx,dy,lmx,lmy)/q+get(x,y,lmx,lmy)/r;
}
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
    double lx=ax,ly=ay,rx=bx,ry=by,lmx,lmy,rmx,rmy;
    while(fabs(lx-rx)>eps||fabs(ly-ry)>eps)
    {
        lmx=lx+(rx-lx)/3;
        lmy=ly+(ry-ly)/3;
        rmx=rx-(rx-lx)/3;
        rmy=ry-(ry-ly)/3;
        if(cal(lmx,lmy)>cal(rmx,rmy))lx=lmx,ly=lmy;
        else rx=rmx,ry=rmy;
    }
    printf("%.2f\n",cal(lmx,lmy));
    return 0;
}

总结

三分套三分

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/82718563