#include <bits/stdc++.h>
using namespace std;
const int MAXN = 60000 + 7;
const double eps = 1e-8;
int n;
struct F {
double x, v;
bool operator<(F& f)const {
if(fabs(x - f.x) < eps)
return v < f.v;
return x < f.x;
}
}a[MAXN], b[MAXN];
int cnt = 0;
double getT(double x) {
double ans = 0;
for(int i = 0; i < n; ++i) {
ans = max(ans, fabs(a[i].x - x) / a[i].v);
}
return ans;
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%lf", &a[i].x);
}
for(int i = 0; i < n; ++i) {
scanf("%lf", &a[i].v);
}
sort(a, a+n);
double l = a[0].x, r = a[n-1].x, mid, mmid;
mid = (l+r) / 2.0;
mmid = (mid+r) / 2.0;
while(fabs(getT(mid) - getT(mmid)) > eps) {
if(r - l < eps) {
break;
}
if(getT(mid) - getT(mmid) < eps) {
r = mmid;
}
else {
l = mid;
}
mid = (l+r) / 2.0;
mmid = (mid+r) / 2.0;
}
printf("%.6f\n", getT(mid));
return 0;
}
点压缩,优化,将同一点的均压缩为一个点,速度取最小值
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 60000 + 7;
const double eps = 1e-8;
int n;
struct F {
double x, v;
bool operator<(F& f)const {
if(fabs(x - f.x) < eps)
return v < f.v;
return x < f.x;
}
}a[MAXN], b[MAXN];
int cnt = 0;
double getT(double x) {
double ans = 0;
for(int i = 0; i <= cnt; ++i) {
ans = max(ans, fabs(b[i].x - x) / b[i].v);
}
return ans;
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%lf", &a[i].x);
}
for(int i = 0; i < n; ++i) {
scanf("%lf", &a[i].v);
}
sort(a, a+n);
b[0].x = a[0].x;
b[0].v = a[0].v;
for(int i = 1; i < n; ++i) {
if(a[i].x == b[cnt].x) {continue;}
else {
cnt++;
b[cnt].x = a[i].x;
b[cnt].v = a[i].v;
}
}
double l = b[0].x, r = b[cnt].x, mid, mmid;
mid = (l+r) / 2.0;
mmid = (mid+r) / 2.0;
while(fabs(getT(mid) - getT(mmid)) > eps) {
if(r - l < eps) break;
if(getT(mid) - getT(mmid) < eps) {
r = mmid;
}
else {
l = mid;
}
mid = (l+r) / 2.0;
mmid = (mid+r) / 2.0;
}
printf("%.6f\n", getT(mid));
return 0;
}