853. Car Fleet
解法
由于给的位置是没有规律的,并且给的N的范围是10^4,因此第一时间想到排序。
继续分析,两辆车在直线上运行时,距离终点更近的车的到达时间不会被远车影响,因此我们可以考虑从后往前考虑车的到达情况。
从后往前,先计算当前车的到达时间,如果后面的车的到达时间比当前车短,则两者相遇,车队数目减一,到达时间不变。如果后面的车的到达时间长,则两者不相遇,车队数目不变。
代码
class Solution {
public:
typedef pair<int, int> PII;
int carFleet(int target, vector<int>& position, vector<int>& speed) {
int n = position.size();
vector<PII> data;
for (int i = 0; i < n; i ++) {
data.push_back({position[i], speed[i]});
}
sort(data.begin(), data.end());
int ans = n;
double time = 0, eps = 1e-6;
for (int i = n - 1; i >= 0; i --) {
// cout << i << endl;
double tmp = (target - data[i].first) / (double)data[i].second;
if (tmp > time + eps) {
time = tmp;
} else {
ans --;
}
}
return ans;
}
};