一條線上有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 }