• hdu 3400 Line belt


    题意:给你两条线段AB,CD;然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间。

    思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离和时间就可以。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cmath>
     5 using namespace std;
     6 const double eps=1e-8;
     7 
     8 int t;
     9 double p,q,r;
    10 struct point
    11 {
    12      double x,y;
    13 }a,b,c,d;
    14 
    15 double sqr(double x)
    16 {
    17     return x*x;
    18 }
    19 
    20 double dis(double x1,double y1,double x2,double y2)
    21 {
    22     return sqrt(sqr(x1-x2)+sqr(y1-y2)+eps);
    23 }
    24 
    25 double ok(double t1)
    26 {
    27     point pos;
    28     pos.x=a.x+(b.x-a.x)*((t1*p)/dis(a.x,a.y,b.x,b.y));
    29     pos.y=a.y+(b.y-a.y)*((t1*p)/dis(a.x,a.y,b.x,b.y));
    30     double l1=0,r1=dis(c.x,c.y,d.x,d.y)/q;
    31     while(r1-l1>eps)
    32     {
    33         double mid1=(r1+l1)/2;
    34         double mid2=(mid1+r1)/2;
    35         double x1=d.x+(c.x-d.x)*((mid1*q)/dis(c.x,c.y,d.x,d.y));
    36         double y1=d.y+(c.y-d.y)*((mid1*q)/dis(c.x,c.y,d.x,d.y));
    37         double x2=d.x+(c.x-d.x)*((mid2*q)/dis(c.x,c.y,d.x,d.y));
    38         double y2=d.y+(c.y-d.y)*((mid2*q)/dis(c.x,c.y,d.x,d.y));
    39         double d1=dis(pos.x,pos.y,x1,y1)/r;
    40         double d2=dis(pos.x,pos.y,x2,y2)/r;
    41         if(d1+mid1<=d2+mid2)
    42         {
    43             r1=mid2;
    44         }
    45         else
    46             l1=mid1;
    47     }
    48     double xx=d.x+(c.x-d.x)*(l1*q)/dis(c.x,c.y,d.x,d.y);
    49     double yy=d.y+(c.y-d.y)*(l1*q)/dis(c.x,c.y,d.x,d.y);
    50     return dis(pos.x,pos.y,xx,yy)/r+t1+l1;
    51 }
    52 
    53 int main()
    54 {
    55     scanf("%d",&t);
    56     while(t--)
    57     {
    58         scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
    59         scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
    60         scanf("%lf%lf%lf",&p,&q,&r);
    61         double ll=0,rr=dis(a.x,a.y,b.x,b.y)/p;
    62         while(rr-ll>eps)
    63         {
    64             double mid1=(ll+rr)/2;
    65             double mid2=(mid1+ll)/2;
    66             if(ok(mid2)>=ok(mid1))
    67             {
    68                 ll=mid2;
    69             }
    70             else
    71                 rr=mid1;
    72         }
    73         printf("%.2lf
    ",ok(ll));
    74     }
    75 }
    View Code
  • 相关阅读:
    CentOS7.4安装Docker
    责任链模式
    策略模式
    状态模式
    解释器模式
    备忘录模式
    中介者模式
    观察者模式
    迭代器模式
    private、default、protected和public的作用域
  • 原文地址:https://www.cnblogs.com/fanminghui/p/4124745.html
Copyright © 2020-2023  润新知