zoukankan      html  css  js  c++  java
  • hdu Line belt

    Line belt

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 85 Accepted Submission(s): 47
    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
     三分搜索:

    如图所示必定在AB CD上存在XY 使得A---D 用时间最短。用三分法针对AB间的某个点找出在CD段上最小的点,

    嵌套循环找出最小的时间。有关时间函数在AB段和在CD段均为凸函数,所以可以用三分法。


    #include <iostream>
    #include
    <stdio.h>
    #include
    <math.h>
    using namespace std;
    struct point
    {
    double x,y;
    };
    int p,q,r,v;
    double dis(point a,point b)
    {
    return pow(pow(a.y-b.y,2)+pow(a.x-b.x,2),1.0/2);
    }
    double findy(point c,point d,point y)
    {
    point mid,midmid,left,right;
    double t1,t2;
    left
    = c;
    right
    = d;
    do
    {
    mid.x
    = (left.x+right.x)/2;
    mid.y
    = (left.y+right.y)/2;
    midmid.x
    = (right.x+mid.x)/2;
    midmid.y
    = (right.y+mid.y)/2;
    t1
    = dis(d,mid)/q+dis(mid,y)/r;
    t2
    = dis(d,midmid)/q+dis(midmid,y)/r;
    if(t1>t2)
    left
    = mid;
    else right = midmid;
    }
    while(fabs(t1-t2)>0.000001);
    return t1;
    }
    double find(point a,point b,point c,point d)
    {
    point mid,midmid,left,right;
    double t1,t2;
    left
    = a;
    right
    = b;
    do
    {
    mid.x
    = (left.x+right.x)/2;
    mid.y
    = (left.y+right.y)/2;
    midmid.x
    = (right.x+mid.x)/2;
    midmid.y
    = (right.y+mid.y)/2;
    t1
    = dis(a,mid)/p+findy(c,d,mid);
    t2
    = dis(a,midmid)/p+findy(c,d,midmid);
    if(t1>t2)left = mid;
    else right = midmid;
    }
    while(fabs(t1-t2)>0.000001);
    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",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
    scanf(
    "%d%d%d",&p,&q,&r);
    printf(
    "%.2f\n",find(a,b,c,d));
    }
    return 0;
    }

  • 相关阅读:
    带有时间间隔的dp
    单调队列优化dp(捡垃圾的机器人)
    实现技巧
    树形dp(灯与街道)
    括号匹配(数组链表模拟)
    二分,求直线上覆盖所有点的最短时间
    可持久化链表(链式前向星)
    二分图匹配模板题
    网络流,设备、插头和转接器建图(简单map的应用)
    第七周助教总结
  • 原文地址:https://www.cnblogs.com/newpanderking/p/2155430.html
Copyright © 2011-2022 走看看