首页 > 代码库 > CF782B The Meeting Place Cannot Be Changed

CF782B The Meeting Place Cannot Be Changed

题意:

The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction.

At some points on the road there are n friends, and i-th of them is standing at the point xi meters and can move with any speed no greater than vi meters per second in any of the two directions along the road: south or north.

You are to compute the minimum time needed to gather all the n friends at some point on the road. Note that the point they meet at doesn‘t need to have integer coordinate.

Input

The first line contains single integer n (2?≤?n?≤?60?000) — the number of friends.

The second line contains n integers x1,?x2,?...,?xn (1?≤?xi?≤?109) — the current coordinates of the friends, in meters.

The third line contains n integers v1,?v2,?...,?vn (1?≤?vi?≤?109) — the maximum speeds of the friends, in meters per second.

Output

Print the minimum time (in seconds) needed for all the n friends to meet at some point on the road.

Your answer will be considered correct, if its absolute or relative error isn‘t greater than 10?-6. Formally, let your answer be a, while jury‘s answer be b. Your answer will be considered correct if 技术分享 holds.

Examples
input
3
7 1 3
1 2 1
output
2.000000000000
input
4
5 10 3 2
2 3 2 4
output
1.400000000000

思路:

二分,注意控制精度。

实现:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <iomanip>
 5 using namespace std;
 6 struct node
 7 {
 8     double pos;
 9     double speed;
10 };
11 node a[60005];
12 int n;
13 double minn, maxn;
14 bool check(double t)
15 {
16     minn = a[0].pos - t * a[0].speed;
17     maxn = a[0].pos + t * a[0].speed;
18     for (int i = 1; i < n; i++)
19     {
20         double tmp_l = a[i].pos - t * a[i].speed;
21         double tmp_r = a[i].pos + t * a[i].speed;
22         minn = max(minn, tmp_l);
23         maxn = min(maxn, tmp_r);
24     }
25     return maxn - minn >= 1e-7;
26 }
27 
28 double solve()
29 {
30     double l = 0.0, r = 1000000005, res = 1000000005;
31     for (int i = 0; i < 10000; i++)
32     {
33         double mid = (l + r) / 2.0;
34         if (check(mid))
35         {
36             r = mid;
37             res = mid;
38         }
39         else
40         {
41             l = mid;
42         }
43     }
44     return res;
45 }
46 
47 int main()
48 {
49     cin >> n;
50     for (int i = 0; i < n; i++)
51     {
52         cin >> a[i].pos;
53     }
54     for (int i = 0; i < n; i++)
55     {
56         cin >> a[i].speed;
57     }
58     cout << setprecision(7) << solve() << endl;
59     return 0;
60 }

 

CF782B The Meeting Place Cannot Be Changed