zoukankan      html  css  js  c++  java
  • 洛谷P2571 [SCOI2010]传送带

    P2571 [SCOI2010]传送带

    题目描述

    在一个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
    /*
        这道题简单一点的话来说就是三分套三分
        首先三分AB上的点 这个点设为E 然后通过点E三分CD上的点F 这样不断地缩小范围就可以了
    */
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const double dec=0.00001;
    double xa,ya,xb,yb,xc,yc,xd,yd;
    double q,p,r;
    double count(double xe,double ye,double xf,double yf)
    {
      return ((sqrt((xe-xa)*(xe-xa)+(ye-ya)*(ye-ya)))/p)+((sqrt((xf-xe)*(xf-xe)+(ye-yf)*(ye-yf)))/r)+((sqrt((xd-xf)*(xd-xf)+(yd-yf)*(yd-yf)))/q);
    }
    double narrow(double x,double y)
    {
      double fcx=xc,fdx=xd,fcy=yc,fdy=yd;double minn;
      while(fabs(fcx-fdx)>dec||fabs(fcy-fdy)>dec)
      {
         double midx=(fcx+fdx)/2,midy=(fcy+fdy)/2;
         double remidx=(midx+fdx)/2,remidy=(midy+fdy)/2;
         double ans1=count(x,y,midx,midy),ans2=count(x,y,remidx,remidy);
         if(ans1>ans2)  fcx=midx,fcy=midy;
         else fdx=remidx,fdy=remidy;
         minn=min(ans1,ans2);
      }      
      return minn;
    }
    int main()
    {
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&xa,&ya,&xb,&yb,&xc,&yc,&xd,&yd,&p,&q,&r);
        double fax=xa,fbx=xb,fay=ya,fby=yb;double minn;
        while(1)
        {
          double midx=(fax+fbx)/2,midy=(fay+fby)/2;
          double remidx=(midx+fbx)/2,remidy=(midy+fby)/2;
          double ans1=narrow(midx,midy),ans2=narrow(remidx,remidy);
          if(ans1>ans2) fax=midx,fay=midy;
          else fbx=remidx,fby=remidy;   
          minn=min(ans1,ans2);   
          if(fabs(fax-fbx)<dec&&fabs(fay-fby)<dec) break;
        }
        printf("%.2lf",minn);
        return 0;
    }
     
     
  • 相关阅读:
    spring学习记录_Spring中的新注解
    spring学习记录_spring的 注解
    spring学习记录_spring的 ioc核心容器
    关于myeclipse项目运行报错:Access denied for user 'root'@'localhost' (using password: YES)
    vue项目中实现多语言切换
    OC中限制UITextView的最大字数的实现
    简单瀑布流的实现
    仿购物车的实现
    仿QQ好友列表界面的实现
    类似QQ侧滑菜单功能实现
  • 原文地址:https://www.cnblogs.com/thmyl/p/7729893.html
Copyright © 2011-2022 走看看