(登山法)codeforces 782B - The Meeting Place Cannot Be Changed

題意:

一條線上有n我的,每一個人一個座標值xi,每一個人有一個最大行走速度vi,問若是要讓這n我的走到線上某一個點,最少須要多少時間。ios

 

分析:

看起來是二分,spa

二分座標。code

後來得知實際上是登山法blog

二分區間變化的條件,一開始感受是比較當前mid座標左右人們用最快速度到達的平均時間,string

後來具體寫的時候感受是比較當前mid座標左右人們用最快速度到達的最大時間。it

其實就是後者。io

若是某一邊的最大時間比較大的話,座標就要向那一邊偏移,class

最後循環退出的條件就是在偏差之內。stream

另外的兩種解法應該是二分時間和三分座標。循環

 

代碼:

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <cmath>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <bitset>
 9 #include <string>
10 #include <cctype>
11 #include <cstdio>
12 #include <cstring>
13 #include <cstdlib>
14 #include <iostream>
15 #include <algorithm>
16 #include <unordered_map>
17 
18 using namespace std;
19 
20 typedef long long ll;
21 typedef unsigned long long ull;
22 #define inf (0x3f3f3f3f)
23 #define lnf (0x3f3f3f3f3f3f3f3f)
24 #define eps (1e-6)
25 int sgn(double a) {
26     return a < -eps ? -1 : a < eps ? 0 : 1;
27 }
28 
29 //--------------------------
30 
31 const ll mod = 1000000007;
32 const int maxn = 100010;
33 
34 
35 struct friends {
36     int a, b;
37 } f[60010];
38 
39 bool cmp(friends a, friends b) {
40     if(a.a != b.a)  return a.a < b.a;
41     else return a.b < b.b;
42 }
43 
44 void solve() {
45     int n;
46     scanf("%d", &n);
47     for(int i = 0; i < n; i++) {
48         scanf("%d", &f[i].a);
49     }
50     for(int i = 0; i < n; i++) {
51         scanf("%d", &f[i].b);
52     }
53     sort(f, f + n, cmp);
54     double left = f[0].a, right = f[n - 1].a;
55 
56     while(fabs(right - left) >= 1e-6) {
57         double mid = (left + right) / 2;
58         double lmax = 0, rmax = 0;
59         60         for(int i = 0; i < n; i++) {
61             if(f[i].a < mid) {
62                 lmax = max(lmax, fabs(mid - (double)f[i].a) / f[i].b);
63             } else {
64                 rmax = max(rmax, fabs(mid - (double)f[i].a) / f[i].b);
65             }
66             67         }
68         if(lmax < rmax) {
69             left = mid;
70         } else {
71             right = mid;
72         }
73     }
74     double res = fabs(left + right) / 2;
75     double ans = 0;
76     for(int i = 0; i < n; i++) {
77         ans = max(ans, fabs(res - (double)f[i].a) / f[i].b);
78     }
79     printf("%f\n", ans);
80 }
81 
82 int main() {
83 
84 #ifndef ONLINE_JUDGE
85     freopen("1.in", "r", stdin);
86     //freopen("1.out", "w", stdout);
87 #endif
88     // iostream::sync_with_stdio(false);
89     solve();
90     return 0;
91 }
相關文章
相關標籤/搜索