E. Find the Car

https://codeforces.com/problemset/problem/1971/E

题意:给定一个长度n,以及在n的范围内的k个点坐标,其中k个数的最后一个必为n,告诉k个点到达的时间。现在有q个询问,每次询问给出一个坐标d,问到达d的时间,题目要求输出整数,向下取整。

思路:d分为三种情况,d为起点0,d为k中的某个坐标,d为两个坐标中间的坐标。前两种情况直接输出答案,第三种情况需要考虑到达前面坐标的时间,以及从前面坐标到后面坐标的速度,d与前面坐标的距离,然后直接算即可。

总结:题目思路简单,但是通过率不高,原因竟然是精度被卡了,题目必须用long double,而且在使用距离计算时间时,必须要先乘,再除。。。抽象。

inline void solve() {
    int n, k, q;
    cin >> n >> k >> q;

    vector<long double> a(k + 1), b(k + 1);
    for (int i = 1; i <= k; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= k; ++i) {
        cin >> b[i];
    }

    while (q --) {
        long double d;
        cin >> d;
        if (!d) {
            cout << 0 << " \n"[q == 0];
            continue;
        }

        int p = lower_bound(a.begin(), a.end(), d) - a.begin();
        if (a[p] == d) {
            cout << (int)(b[p]) << " \n"[q == 0];
            continue;
        }
        
        int i = p - 1;
        int j = p;        


        cout << (int)(b[i] + ((d - a[i]) * (b[j] - b[i]) / (a[j] - a[i]))) << " \n"[q == 0];
    }

}
posted @ 2025-05-28 09:40  _Yxc  阅读(61)  评论(0)    收藏  举报