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 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  阅读(83)  评论(0)    收藏  举报