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. Angular - Templates(模板)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 在Angular中,模板是一个包含了Angular特定元素和属性的HTML.Angula ...

  2. C++ sizeof 误区 大公司面试题

    1.C++ 无成员变量和函数的类型的实例,求该实例的sizeof? 答:是1.(不是0) 2.如果在题1的基础上有1个成员变量,sizeof是(1+成员变量的大小)吗? 答:不是,是成员变量的大小. ...

  3. POJ1422Air Raid(二分图,最小不相交路径覆盖)

    Air Raid Consider a town where all the streets are one-way and each street leads from one intersecti ...

  4. 搭建LAMP环境示例

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  5. ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

    在开发数据库应用程序的时候,经常会遇到某些表需要添加字段或者修改类型.新增表等需求,而对于EF Code First来说关注的只有实体类,当需求变更时只需要添加新的实体类或者在实体类中添加.删除.修改 ...

  6. zoj3954 详细讲解 排序比较单词法

    Seven-Segment Display Time Limit: 1 Second      Memory Limit:65536 KB A seven segment display, or se ...

  7. IDL 数组运算

    1.求大.求小和求余 IDL> arr=indgen(4) IDL> print,arr 0 1 2 3 IDL> print,arr>3 3 3 3 3 IDL> pr ...

  8. C#无限分级实现,前端WEB页面接收,后台提供层级Json数据

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...

  9. 【解决方案】客户端请求数据较大时,nginx返回数据被截断

    [问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...

  10. 完整Log4Net配置信息

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...