搜索(三分):HDU 3400 Line belt

Line belt

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

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

  

 1 //rp++
 2 //#include <bits/stdc++.h>
 3
 4 #include <iostream>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <cmath>
 8
 9 using namespace std;
10
11 double eps=1e-8;
12
13 double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,P,Q,R;
14
15 double DIS(double x1,double y1,double x2,double y2)
16 {
17     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
18 }
19
20
21 double Get_Time(double p1,double p2)
22 {
23     return DIS(Ax,Ay,Ax+p1*(Bx-Ax),Ay+p1*(By-Ay))*1.0/P+DIS(Dx,Dy,Dx+p2*(Cx-Dx),Dy+p2*(Cy-Dy))*1.0/Q+
24            DIS(Bx+(1.0-p1)*(Ax-Bx),By+(1.0-p1)*(Ay-By),Cx+(1.0-p2)*(Dx-Cx),Cy+(1.0-p2)*(Dy-Cy))*1.0/R;
25 }
26
27 double Get_MIN(double pos)
28 {
29     double L=0.0,R=1.0,x,y,ret;
30     while(R-L>=eps)
31     {
32         x=(R+2*L)/3.0;
33         y=(2*R+L)/3.0;
34
35         x=Get_Time(pos,x);
36         y=Get_Time(pos,y);
37
38
39         if(x-y>=eps)L=(R+2*L)/3.0;
40         else R=(2*R+L)/3.0;
41
42         ret=min(x,y);
43     }
44     return ret;
45 }
46
47 double Solve()
48 {
49     double L=0.0,R=1.0,x,y,ret;
50     while(R-L>=eps)
51     {
52         x=(2*L+R)/3.0;
53         y=(L+2*R)/3.0;
54
55         x=Get_MIN(x);
56         y=Get_MIN(y);
57
58
59         if(x-y>=eps)L=(2*L+R)/3.0;
60         else R=(L+2*R)/3.0;
61
62         ret=min(x,y);
63     }
64     return ret;
65 }
66
67 int main()
68 {
69     int T;
70     scanf("%d",&T);
71     while(T--)
72     {
73         scanf("%lf%lf%lf%lf",&Ax,&Ay,&Bx,&By);
74         scanf("%lf%lf%lf%lf",&Cx,&Cy,&Dx,&Dy);
75         scanf("%lf%lf%lf",&P,&Q,&R);
76
77         printf("%.2lf\n",Solve());
78     }
79     return 0;
80 }
时间: 2024-11-14 16:59:37

搜索(三分):HDU 3400 Line belt的相关文章

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

Line belt Problem's Link:    Mean: 给出两条平行的线段AB, CD,然后一个人在线段AB的A点出发,走向D点,其中,人在线段AB上的速度为P, 在线段CD上的速度为Q,在其他地方的速度为R,求人从A点到D点的最短时间. analyse: 经典的三分套三分. 首先在AB线段上三分,确定一个点,然后再在CD上三分,确定第二个点,计算出answer.也就是嵌套的三分搜索. Time complexity: O(logn*logm) Source code:  // M

HDU 3400 Line belt 三分

笨蛋的难题(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述        笨蛋之所以称为笨蛋,是因为他有点路痴.他一旦不高兴,就必然一个人漫无目的的出去走走.今天下雨了,他又不高兴了,怎么办?那就出去走呗,这不又丢了,这次幸好记下出来时的方向,并且在一张纸上密密麻麻的记下了他拐的弯(他很聪明吧,拐的弯都是90度的弯),0代表左拐,1代表右拐,那么多0.1,他实在看不下去了,正好遇见善良加聪明的你,你能告诉他,他现在面向哪吗? 输入 多组测试数据 第一行 输入:

HDU 3400 Line belt (三分再三分)

HDU 3400 Line belt (三分再三分) ACM 题目地址: HDU 3400 Line belt 题意: 就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑,在其他地方跑速度是r.问你从A到D最少的时间. 分析: 先三分AB上的点,再三分CD上的点即可. 证明: 设E在AB上,F在CD上. 令人在线段AB上花的时间为:f = AE / p,人走完Z和Y所花的时间为:g = EF / r + FD / q. f函数是一个单调递增的函数,而g很明显是一个先递减后递

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 segment

hdu 3400 Line belt

题意:给你两条线段AB,CD:然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间. 思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离和时间就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 const double ep

【HDOJ】3400 Line belt

三分. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 5 typedef struct { 6 double x, y; 7 } Point_t; 8 9 Point_t A, B, C, D; 10 const double eps = 1.0e-8; 11 double P, Q, R; 12 13 double dist(Point_t a, Point_t b) { 14 return

【搜索】HDU 5348 MZL&#39;s endless loop

通道 题意:给出n个点,m条边,现在要给边定向使得点的出度和入度的差不超过1 思路: 对每个点进行出度和入度的判断,如果出度大,就先进行反向的搜索(每搜索一条边u,v就认为这是一条v到u的有向边),反之,进行正向搜索(每搜到一条边u,v认为这是一条u到v的有向边),一直搜索到找不到边能继续为止,每条边只遍历一次 代码: #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #inclu

【HDU 3400】Line belt(三分法)

题目链接 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3400 题意 有两条传送带AB和CD,移动速度分别为p,q. 除了传送带的其他区域移动速度为r,问A到D最短时间. 题目分析 在AB上找一点E,在CD上找一点F. 使得A->E->F->D时间最短. 数学思路 时间 time = |AE|/p + |EF|/r + |FD|/q. (|AE|为线段AE的长度.) 未知量有E的位置和F的位置,由于确定在AB和CD上,所以只需要两个未知量

HDU3400 Line belt (几何+三分)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3400 题意: 给定两条平行的路的左右端点的坐标.然后给定三个速度求表示在分别在两条路上的速度和不在路上走的速度 求从点A走到点D的最短时间. 分析: 先假定一个点固定的话 那么中间肯定有一个点可以使时间最小 然后是一个下凸型函数, 我们可以用三分来求.但是本题的两个点都不固定,那么思考一下 我们就可以尝试用 两个三分来做,一个三分求一条路上的点,另一个求另外一条路上的点. 注意求距离开方的时候会有