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;
    }

  • 相关阅读:
    python学习笔记(二)-字符串方法
    python学习笔记(一)-基础知识
    Charles抓包工具断点修改返回内容
    Charles抓包工具过滤网络请求
    Jmeter通过正则表达式提取器提取响应结果数据
    【PHP】什么时候使用Try Catch(转)
    【tp5.1】七牛云上传图片
    【PHP】统计问卷调查结果的选项票数和百分比
    【tp5.1】composer安装PHPExcel以及导入导出Excel
    【tp5.1】微信公众号授权登录及获取信息录入数据库
  • 原文地址:https://www.cnblogs.com/newpanderking/p/2155430.html
Copyright © 2011-2022 走看看