Codeforces #403 Div.2 B.The Meeting Place Cannot Be Changed

来源:互联网 发布:2017电视选购 知乎 编辑:程序博客网 时间:2024/06/05 18:06

题目链接

#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;}


0 0
原创粉丝点击