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

浙公网安备 33010602011771号