• 传送带(三分)


    在一个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

    1≤ Ax,Ay,Bx,By,Cx,Cy,Dx,Dy≤1000

    1≤P,Q,R≤10

    输出

     

    输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位

    样例输入  

    0 0 0 100
    100 0 100 100
    2 2 1

     

    样例输出

    136.60

     解题思路: 现在AB线段上固定一个点 这样对CD段三分找最优解 然后对AB三分得到最终最优解; 三分套三分!

     

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 double P,Q,R;
     4 
     5 struct Node{
     6     double x,y;
     7 }A,B,C,D;
     8 
     9 Node X,Y;
    10 
    11 double Sum(Node a,Node b){  //求两点之间的juli
    12     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+1e-9);
    13 }
    14 
    15 double solve(double ax){  //x    y+yd 的时间
    16     Y.x=C.x+(D.x-C.x)*(ax/Sum(C,D));
    17     Y.y=C.y+(D.y-C.y)*(ax/Sum(C,D));
    18     return Sum(X,Y)*1.0/R+Sum(Y,D)*1.0/Q;
    19 }
    20 
    21 double Thren_CD(double x){
    22     X.x=A.x+(B.x-A.x)*(x/Sum(A,B));
    23     X.y=A.y+(B.y-A.y)*(x/Sum(A,B));
    24     double cd=Sum(C,D);
    25     double left=0.0,right=cd;
    26     double eps=1e-9;
    27     double ans=1000000000;
    28     while(left+eps<right){
    29         double midleft=left+(right-left)/3;
    30         double midright=right-(right-left)/3;
    31         double shu1=solve(midleft);
    32         double shu2=solve(midright);
    33         if(shu1<=shu2) right=midright;
    34         else left=midleft;
    35         ans=min(shu1,shu2);
    36     }
    37     return ans+x*1.0/P;
    38 }
    39 
    40 double Thren_AB(double left,double right){
    41     double eps=1e-9;
    42     double res=1000000000;
    43     while(left+eps<right){
    44         double midleft=left+(right-left)/3;
    45         double midright=right-(right-left)/3;
    46         double shu1=Thren_CD(midleft);   //AB上固定的点到Y的距离+AX;
    47         double shu2=Thren_CD(midright);
    48         if(shu1<=shu2) right=midright;
    49         else left=midleft;
    50 //        printf("%.4f%.4f
    ",shu1,shu2);
    51         res=min(res,min(shu1,shu2));
    52     }
    53     return res;
    54 }
    55 
    56 int main(){
    57     scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);
    58     scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y);
    59     scanf("%lf%lf%lf",&P,&Q,&R);
    60 //    printf("%.4f %.4f %.4f %.4f
    ",A.x,A.y,B.x,B.y);
    61 //    printf("%.4f
    ",Sum(A,B));
    62     printf("%.2f
    ",Thren_AB(0.0,Sum(A,B)));   ///对AB进行三分
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    ZYB建围墙
    换根DP
    原码,反码,补码的计算
    字符串游戏-博弈论-trie
    【十连赛day8】神炎皇
    生成序列
    【USACO 2006 February Silver】产奶安排Stall Reservations-贪心
    tar 压缩解压命令
    java 注解
    回溯算法解决全排列问题
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11255764.html
Copyright © 2020-2023  润新知