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
题意:有两个传送带,由A到B的速度是p,有C到D的速度是q,其他速度是r,求由A到D的最少时间;如图(原创)
解题思路:在A,B之间去mid,然后三分求最小时间,三分过程中是A到mid的时间加上mid到D的时间(mid到D的时间,也用三分求,最好写一个函数,求A到mid的时间用三分时,每计算一次,都得在当前状态求一个mid到D的时间),然后就能得出来最小时间;
感悟:思路不好想;刚开始想的是,在AB中去mid先求出最合适的mid到D的时间,然后把B转移到mid,然后再在CD上取mid,求最合适的mid;这样不是动态中求得,不行。
思路不好写,代码更不好写啊,用do,while能过,用while就过不了;
代码:
#include

#include

#include

#include

#include

using namespace std;

const double eps=1e-6;





struct coordinate

{

    double
x;

    double
y;

};

coordinate A,B,C,D;

int t;

double p,q,r;

double dis(coordinate a,coordinate b)

{

    double
t;

   
t=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));

   
//printf("t=%.2f\n",t);

    return
t;

}//求两点之间的距离

coordinate midc(coordinate a,coordinate b)

{

    coordinate
t;

   
t.x=(a.x+b.x)*0.5;

   
t.y=(a.y+b.y)*0.5;

    return
t;

}//求坐标的中点

double time(coordinate a,coordinate b,coordinate c,coordinate
d)

{

    double
t;

   
t=dis(a,b)/p+dis(b,c)/r+dis(c,d)/q;

   
//printf("t=%.2f\n",t);

    return
t;

}//求路径的总时间

double Three_algorithm_1(coordinate a,coordinate c,coordinate
d)

{

    double
t1,t2;

    coordinate
left,right,mid,midmid;

   
left=c;

   
right=d;

    do

    {

       
mid=midc(left,right);

       
midmid=midc(mid,right);

      
// printf("dis(right,left)=%.5f\n",dis(right,left));

       
t1=dis(a,mid)/r+dis(mid,d)/q;

       
t2=dis(a,midmid)/r+dis(midmid,d)/q;

       
if(t1>t2)left=mid;

       
else right=midmid;

   
}while(dis(right,left)>=eps);

    return
t1;

}//先求出A到CD段的最小时间

double Three_algorithm_2(coordinate a,coordinate b,coordinate
c,coordinate d)

{

    double
t1,t2;

    coordinate
left,right,mid,midmid;

   
left=a;

   
right=b;

   
mid=midc(left,right);

   
midmid=midc(mid,right);

    do

    {

       
mid=midc(left,right);

       
midmid=midc(mid,right);

       
//printf("dis(right,left)=%.f\n",dis(right,left));

       
t1=dis(a,mid)/p+Three_algorithm_1(mid,c,d);

       
t2=dis(a,midmid)/p+Three_algorithm_1(midmid,c,d);

       
if(t1>t2)left=mid;

       
else right=midmid;

   
}while(dis(right,left)>=eps);

    return
t1;

}//加上前面求出的先求出A到CD段的最小时间,用三分求最少时间

int main()

{

   
//freopen("in.txt", "r", stdin);

   
scanf("%d",&t);

    for(int
i=0;i

    {

       
scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);

       
scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y);

       
scanf("%lf%lf%lf",&p,&q,&r);

       
printf("%.2lf\n",Three_algorithm_2(A,B,C,D));

    }

}

Line belt的更多相关文章

  1. 三分套三分 --- HDU 3400 Line belt

    Line belt Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3400 Mean: 给出两条平行的线段AB, CD,然后一 ...

  2. 搜索(三分):HDU 3400 Line belt

    Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU 3400 Line belt (三分嵌套)

    题目链接 Line belt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. HDU 3400 Line belt (三分再三分)

    HDU 3400 Line belt (三分再三分) ACM 题目地址:  pid=3400" target="_blank" style="color:rgb ...

  5. Line belt(三分镶嵌)

    In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's spee ...

  6. HDU 3400 Line belt【三分套三分】

    从A出发到D,必定有从AB某个点E出发,从某个点F进入CD 故有E,F两个不确定的值. 在AB上行走的时间   f = AE / p 在其他区域行走的时间 g = EF / r 在CD上行走的时间   ...

  7. hdu Line belt

    这道题是一道3分搜索的题.其实这种题很多时候都出现在高中的解析几何上,思路很简单,从图中可以看到,肯定在AB线段和CD线段上各存在一点x和y使得所花时间最少 因为AB和CD上的时间与x和y点的坐标都存 ...

  8. hdu 3400 Line belt 三分法

    思路:要求最短时间从A到D,则走的路线一定是AB上的一段,CD上的一段,AB与CD之间的一段. 那么可以先三分得到AB上的一个点,在由这个点三分CD!! 代码如下: #include<iostr ...

  9. hdu 3400 Line belt

    题意:给你两条线段AB,CD:然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间. 思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离 ...

随机推荐

  1. pycharm 2017新建文件添加编码方式等

    file->setting->Editor->File and Code Templates->Python Script 添加 #!/usr/bin/python3# -*- ...

  2. js两个叹号的使用

    1.浏览器判断空和未定义以及零时返回的值如下: alert(undefined)  //undefined alert(null)  //null alert(0)  //0 2.有时为了便于下一步判 ...

  3. 自己写实现char TO wchar_t 的转换

    wchar_t CharToWChart(char nChar){    wchar_t nR;    nR=nChar+32*256;    return nR;}//--------------- ...

  4. 修改host可以上的一些网站

    打开路径 C:\Windows\System32\drivers\etc 博客园 223.6.248.220 www.cnblogs.com github 192.30.253.112 github. ...

  5. Spring REST 与 Zuul 代理

    http://www.baeldung.com/spring-rest-with-zuul-proxy 作者: Eugen Paraschiv 译者: http://oopsguy.com 1.概述 ...

  6. uvalive 3135 Argus

    https://vjudge.net/problem/UVALive-3135 题意: 有一个系统有多个指令,每个指令产生一个编号为qnum的时间,每个指令的触发间隔不相同,现在给出若干个指令,现在的 ...

  7. Java历程-初学篇 Day02变量,数据类型和运算符

    一,数据类型 1,基础数据类型 整型 byte short int long 浮点型 float double 字符型 char 布尔类型 boolean 2,引用类型 String 字符串型 二,变 ...

  8. ZOJ-2091-Mean of Subsequence (反证法的运用!!)

    http://blog.csdn.net/u014355480/article/details/40862041 ZOJ2091 题意:其实就是找后几个数的平均值的最大值!! (贪心策略!要找对) k ...

  9. ZOJ2067 经典 DP

    题目:一个由'.'和'#'组成矩形,统计里面'.'组成的矩形的个数.点击打开链接 自己写挂了,懒得搞了 #include <stdio.h> #include <string.h&g ...

  10. HDU 5934 强联通分量

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...