zoukankan      html  css  js  c++  java
  • HDU 3400 Line belt (三分嵌套)

    题目链接

    Line belt

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 2862    Accepted Submission(s): 1099


    Problem Description
    In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the speed R on other area on the plane.
    How long must he take to travel from A to D?
     
    Input
    The first line is the case number T.
    For each case, there are three lines.
    The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
    The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
    The third line, three integers, P Q R.
    0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
    1<=P,Q,R<=10
     
    Output
    The minimum time to travel from A to D, round to two decimals.
     
    Sample Input
    1 0 0 0 100 100 0 100 100 2 2 1
     
    Sample Output
    136.60
     
    Author
    lxhgww&&momodi
     

    题意:

    给出两条传送带的起点到末端的坐标,其中ab为p的速度,cd为q的速度 其他地方为r的速度

    求a到d点的最短时间。

    分析:

    首先要看出来这是一个凹型的函数,

    时间最短的路径必定是至多3条直线段构成的,一条在AB上,一条在CD上,一条架在两条线段之间。

    所有利用两次三分,第一个三分ab段的一点,第二个三分知道ab一点后的cd段的接点。

    刚开始没用do while错了两次,因为如果给的很接近的话,上来的t1没有赋值。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cmath>
     6 #include <algorithm>
     7 #define LL __int64
     8 const int maxn = 1e2 + 10;
     9 const double eps = 1e-8;
    10 using namespace std;
    11 double p, q, r;
    12 struct node
    13 {
    14     double x, y;
    15 }a, b, c, d;
    16 
    17 double dis(node a, node b)
    18 {
    19     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    20 }
    21 
    22 double solve2(node t)
    23 {
    24     double d1, d2;
    25     node le = c;
    26     node ri = d;
    27     node mid, midmid;
    28     do
    29     {
    30         mid.x = (le.x+ri.x)/2.0;
    31         mid.y = (le.y+ri.y)/2.0;
    32         midmid.x = (mid.x+ri.x)/2.0;
    33         midmid.y = (mid.y+ri.y)/2.0;
    34         d1 = dis(t, mid)/r + dis(mid, d)/q;
    35         d2 = dis(t, midmid)/r + dis(midmid, d)/q;
    36         if(d1 > d2)
    37         le = mid;
    38         else ri = midmid;
    39     }while(dis(le, ri)>=eps);
    40     return d1;
    41 }
    42 
    43 double solve1()
    44 {
    45     double d1, d2;
    46     node le = a;
    47     node ri = b;
    48     node mid, midmid;
    49     do
    50     {
    51         mid.x = (le.x+ri.x)/2.0;
    52         mid.y = (le.y+ri.y)/2.0;
    53         midmid.x = (mid.x+ri.x)/2.0;
    54         midmid.y = (mid.y+ri.y)/2.0;
    55         d1 = dis(a, mid)/p + solve2(mid);
    56         d2 = dis(a, midmid)/p + solve2(midmid);
    57         if(d1 > d2)
    58         le = mid;
    59         else ri = midmid;
    60     }while(dis(le, ri)>=eps);
    61     return d1;
    62 }
    63 
    64 int main()
    65 {
    66     int t;
    67     scanf("%d", &t);
    68     while(t--)
    69     {
    70         scanf("%lf%lf%lf%lf", &a.x, &a.y, &b.x, &b.y);
    71         scanf("%lf%lf%lf%lf", &c.x, &c.y, &d.x, &d.y);
    72         scanf("%lf%lf%lf", &p, &q, &r);
    73         printf("%.2lf
    ", solve1());
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    HDU-3336-Count the string(扩展KMP)
    洛谷-P3805-Manacher模板
    洛谷-p5410-扩展KMP模板
    HDU-2594-Simpsons' Hidden Talents(kmp, 扩展kmp)
    POJ-3080-Blue jeans(KMP, 暴力)
    [办公应用]两个单独的列数据快速变为两列匹配关联数据
    [办公应用]如何将单词中的部分字母加下划线
    [办公应用]word 2007:全屏快捷键,让复制图片保持原样大小(office 全屏快捷键)
    [办公自动化]如何让excel图表标签中显示最新值数据
    [计算机故障处理]无法访问网络共享资源
  • 原文地址:https://www.cnblogs.com/bfshm/p/4119699.html
Copyright © 2011-2022 走看看