三分 传送带

 

题目描述

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间

输入格式

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By

第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy

第三行是3个整数,分别是P,Q,R

输出格式

输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位

输入输出样例

输入 #1
0 0 0 100
100 0 100 100
2 2 1
输出 #1
136.60

说明/提示

对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000

             1<=P,Q,R<=10

思路:三分套三分
对于 A->E->F->D 的函数是单峰函数()

三分坐标(满足斜率)或距离即可

 

code:

//
#include<bits/stdc++.h>
using namespace std;
int T;
double p,q,r;
double eps=1e-11;
double ax,ay,bx,by,cx,cy,dx,dy;
double k1=0,k2=0;
double dist(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double isok(double x,double y)
{
    
    double lx=cx;
    double ly=cy;
    double rx=dx;
    double ry=dy;
    double rmidx=(lx+rx)/2;
    double lmidx=(rmidx+lx)/2;
    double rmidy=(ly+ry)/2;
    double lmidy=(rmidy+ly)/2;
    while(dist(lx,ly,rx,ry)>eps)
    {
        if(dist(rmidx,rmidy,dx,dy)/q+dist(rmidx,rmidy,x,y)/r<dist(lmidx,lmidy,dx,dy)/q+dist(lmidx,lmidy,x,y)/r)
        {
            lx=lmidx;
            ly=lmidy;
        }
        else
        {
            rx=rmidx;
            ry=rmidy;
        }
     rmidx=(lx+rx)/2;
     lmidx=(rmidx+lx)/2;
     rmidy=(ly+ry)/2;
     lmidy=(rmidy+ly)/2;
}
    return dist(x,y,ax,ay)/p+dist(rmidx,rmidy,dx,dy)/q+dist(rmidx,rmidy,x,y)/r;
}

int main()
{
    cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy;
    cin>>p>>q>>r;
    double lx=ax;
    double ly=ay;
    double rx=bx;
    double ry=by;
    double rmidx=(lx+rx)/2;
    double lmidx=(rmidx+lx)/2;
    double rmidy=(ly+ry)/2;
    double lmidy=(rmidy+ly)/2;
    while(dist(lx,ly,rx,ry)>eps)
    {
        if(isok(rmidx,rmidy)<isok(lmidx,lmidy))
        {
            lx=lmidx;
            ly=lmidy;
        }
        else
        {
            rx=rmidx;
            ry=rmidy;
        }
     rmidx=(lx+rx)/2;
     lmidx=(rmidx+lx)/2;
     rmidy=(ly+ry)/2;
     lmidy=(rmidy+ly)/2;
    }
    printf("%.2lf",isok((rmidx+lmidx)/2,(rmidy+lmidy)/2));
}
    

 

posted @ 2019-08-02 18:03  ALEZ  阅读(154)  评论(0编辑  收藏  举报