洛谷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;
}

 

 
 
posted @ 2017-10-25 17:04  Echo宝贝儿  阅读(175)  评论(0编辑  收藏  举报