题目链接
#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;}
新闻热点
疑难解答