zoukankan      html  css  js  c++  java
  • 三分 传送带

    题目描述

    在一个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));
    }
        
    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    (转)排序算法——归并排序与递归
    在serviceImpl里使用自身的方法
    hibernate manytoone中的lazy EAGER
    autowire异常的三个情况
    (转)js的call和apply
    mysql创建外键出错(注意数据库表字段排序)
    easyui datagrid
    ava.lang.NullPointerException的一般解决方法
    spring简单事务管理器
    关于使用注解出现BeanCreationException或者NameNotFoundException的解决方法
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11290366.html
Copyright © 2011-2022 走看看