1006

来源:互联网 发布:淘宝网折叠床单人价格 编辑:程序博客网 时间:2024/05/22 07:56
题意:  
有三行数,第一行,四个整数,A和B的坐标。第二行,四个整数,C和D的坐标。第三行,三个整数,P Q R。ABCD坐标在0和1000之间,PQR在1到10之间,计算a到d的最短路程


思路:在AB上找一个点X,在CD上找一个点Y,按照A-X-Y-D的路线走,分别控制一边利用三分求出最短时间





  #include<iostream>
  #include<stdio.h>
  #include<cmath>
  #include<string.h>
  using namespace std;
  struct point
  {
      double x,y;
  };
  double dis(point a,point b)
  {
      return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  }


  double p,q,r;


  double find2(point a,point c,point d)
  {
      point left,right;
      point mid,midmid;
      double t1,t2;
      left=c;right=d;
      do
      {
          mid.x=(left.x+right.x)/2;
          mid.y=(left.y+right.y)/2;
          midmid.x=(mid.x+right.x)/2;
          midmid.y=(mid.y+right.y)/2;
          t1=dis(a,mid)/r+dis(mid,d)/q;
          t2=dis(a,midmid)/r+dis(midmid,d)/q;
          if(t1>t2)left=mid;
          else right=midmid;
      }
      while(dis(left,right)>=1e-5);
      return t1;
  }
  double find(point a,point b,point c,point d)
  {
      point left,right;
      point mid,midmid;
      double t1,t2;
      left=a;
      right=b;
      do
      {
          mid.x=(left.x+right.x)/2;
          mid.y=(left.y+right.y)/2;
          midmid.x=(mid.x+right.x)/2;
          midmid.y=(mid.y+right.y)/2;
          t1=dis(a,mid)/p+find2(mid,c,d);
          t2=dis(a,midmid)/p+find2(midmid,c,d);
          if(t1>t2)left=mid;
          else right=midmid;
      }while(dis(right,left)>=1e-5);
      return t1;
  }
  int main()
  {


      int t;
      point a,b,c,d;
      scanf("%d",&t);
      while(t--)
      {
          scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y,&p,&q,&r);
          printf("%.2lf\n",find(a,b,c,d));
      }
      return 0;
  }
0 0
原创粉丝点击