HDU3400 三分套三分

题意

就是给你两条线段AB , CD ,一个人在AB以速度p跑,在CD上以q跑,

在其他地方跑速度是r。问你从A到D最少的时间。

三分AB ,然后再三分CD ,模板题目,这题卡精度 eps不能少

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******\n")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 using namespace std;
36 typedef long long  LL;
37 typedef unsigned long long ULL;
38 const int mod = 1e9 + 7;
39 const int maxn = 2e5 + 10;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 int t;
43 double P, Q, R, len1, len2;
44 struct node {
45     double x, y;
46 } a, b, c, d, temp1, temp2;
47 double dist ( node a, node b ) {
48     return sqrt ( eps + ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) );
49 }
50 void caltemp1 ( double cnt ) {
51     temp1.x = a.x + ( b.x - a.x ) / len1 * cnt;
52     temp1.y = a.y + ( b.y - a.y ) / len1 * cnt;
53 }
54 void caltemp2 ( double cnt ) {
55     temp2.x = d.x + ( c.x - d.x ) / len2 * cnt;
56     temp2.y = d.y + ( c.y - d.y ) / len2 * cnt;
57 }
58 double check ( double cnt ) {
59     caltemp1 ( cnt );
60     double l = 0, r = len2, ll, rr, ans1, ans2;
61     while ( r - l > eps ) {
62         ll = ( 2 * l + r ) / 3, rr = ( 2 * r + l ) / 3;
63         caltemp2 ( ll );
64         ans1 = dist ( temp1, temp2 ) / R + dist ( d, temp2 ) / Q;
65         caltemp2 ( rr );
66         ans2 = dist ( temp1, temp2 ) / R + dist ( d, temp2 ) / Q;
67         if ( ans1 < ans2 ) r = rr;
68         else l = ll;
69     }
70     return ans1 + dist ( temp1, a ) / P;
71 }
72 int main()  {
73     scanf ( "%d", &t );
74     while ( t-- ) {
75         scanf ( "%lf%lf%lf%lf", &a.x, &a.y, &b.x, &b.y );
76         scanf ( "%lf%lf%lf%lf", &c.x, &c.y, &d.x, &d.y );
77         scanf ( "%lf%lf%lf", &P, &Q, &R );
78         len1 = dist ( a, b ), len2 = dist ( c, d );
79         double l = 0, r = len1, ll, rr;
80         while ( r - l > eps ) {
81             ll = ( 2 * l + r ) / 3, rr = ( 2 * r + l ) / 3;
82             if ( check ( ll ) < check ( rr ) ) r = rr;
83             else l = ll;
84         }
85         printf ( "%.2f\n", check ( ll ) );
86     }
87     return 0;
88 }

原文地址:https://www.cnblogs.com/qldabiaoge/p/9979604.html

时间: 2024-10-11 16:07:19

HDU3400 三分套三分的相关文章

hdu3400(三分套三分)

题意:平面上两条线段 AB,CD. A到B的速度v1,C到D的速度v2,其他地方的速度V3.求A到D的最短时间. 解法:三分嵌套三分,首先如果AB上的点确定后,确定CD的点的确定应该是符合三分性质的,应该是单调或最多凸型分布的.那么确定AB上的点,也应该不会出现多个峰谷吧.没有严格证明,是知道有个这个三分嵌套三分的题目才来做的. 代码: /****************************************************** * author:xiefubao ******

【bzoj1857】传送带——三分套三分

我的第一道三分题目. 早上跟着cyc学了一下三分,晚上想练一下手发现没什么水题就找到了这一道2333 主要是证明是一个单峰函数,这也是本题最难的部分(网上好多人写出来但不会证明:)) 证明过程来自yyl dalao: 本题要讨论必使r<max(q,p),否则还要走什么传送带... 从A点出发,要使解最优,必定要走A->E->F->D,其中E是AB上一点,F为CD上一点. 因为E和F都是不确定的,我们不妨假设E点已经确定,那么CD上必定存在一点F使得EF和FD最优(先不考虑AE),那

三分套三分 --- 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

【BZOJ-1857】传送带 三分套三分

1857: [Scoi2010]传送带 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 575[Submit][Status][Discuss] Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input 输入

BZOJ 1857 传送带 (三分套三分)

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxhgww想从A点走到D点,他想知道最少需要走多长时间 Input输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,ROutput输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留

bzoj1857 [ SCOI2010 ] -- 三分套三分

显然我们一定是先走到AB上一点X,然后走到CD上一点Y,最后到D. 那么答案就是|AX|/P+|XY|/R+|YD|/Q 假设我们已经确定了X,那么目标就是在CD上找一点Y,使|XY|/R+|YD|/Q最小. 显然这是个单峰函数. 那么三分套三分就可以了. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> us

#10017 传送带(SCOI 2010)(三分套三分)

[题目描述] 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段 AB 和线段 CD.lxhgww 在 AB上的移动速度为 P ,在 CD 上的移动速度为 Q,在平面上的移动速度 R.现在 lxhgww 想从 A 点走到 D 点,他想知道最少需要走多长时间. [题目链接] https://loj.ac/problem/10017 [算法] 猜想两条线段的最优点均满足单峰性质,于是三分套三分,代码借鉴黄学长.(http://hzwer.com/4255.html

D.Country Meow 最小球覆盖 三分套三分套三分 &amp;&amp; 模拟退火

// 2019.10.3 // 练习题:2018 ICPC 南京现场赛 D Country Meow 题目大意 给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值. ? 思路 非常裸的最小球覆盖问题啊,即找到半径最小的球包含全部的点. 在最小圆覆盖问题上,可以使用随机增量法,这里没有四点确定球心的公式,所以板子失效了. 最小圆覆盖可以用三分套三分,这里空间有三维,假装证明得到在任意一维上都满足凸函数特性,那么再套一层维度三分就OK了. ? AC代码 三分套三分套三分写法,复杂度O(n

[THOJ 1589] 椭球面 三分套三分

题意 现在给出一个椭球面: $ax ^ 2 + by ^ 2 + cz ^ 2 + dyz + exz + fxy = 1$ . 求椭球面到 $(0, 0, 0)$ 的距离. $T \le 200, 0 < a, b, c < 1, 0 \le d, e, f < 1$ . 假装 $(0, 0, 0)$ 在椭球内部. 分析 二次的式子通常都是单峰的. 猜测椭球到 $(0, 0, 0)$ 的距离也是单峰的. 三分 x , 三分 y , 利用一元二次方程解出 z 并计算距离. 实现 实现小结