思路:原来没有做过这一类的题目,在网上看了一下题解才明白,这个题目是用二分法来做,而二分的东西正是时间,我们搜索到一个时间使所有的人都能移动到同一个点,而小于这个时间有的人就无法移动到这一个点,这也就是要保证所有的点在时间t内能移动到的点都有交集。明白了这一点以后,就不难求解了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include <string>
#include <set>
#include <queue>
#include <cmath>
#include <iomanip>
#include <vector>
#include <cstdio>
#define MAXN 60010
#define INF 10000000
using namespace std;
int v[MAXN];
int p[MAXN];
int n;
bool judge(double time) {
double left = p[0] - v[0] * time, right = p[0] + v[0] * time;
for (int i = 1; i < n; ++i) {
double l = p[i] - v[i] * time;
double r = p[i] + v[i] * time;
if (r < left || l > right)
return false;
right = min(r, right);
left = max(left, l);
}
return true;
}
int main() {
while (~scanf("%d", &n)) {
for (int i = 0; i < n; ++i)
scanf("%d", &p[i]);
for (int i = 0; i < n; ++i)
scanf("%d", &v[i]);
double left = 0, right = 1e9;
while (right - left > 1e-6) {
double mid = (right + left) / 2;
if (judge(mid))
right = mid;
else
left = mid;
}
printf("%.12f", right);
}
return 0;
}