853. Car Fleet

解法

由于给的位置是没有规律的,并且给的N的范围是10^4,因此第一时间想到排序。
继续分析,两辆车在直线上运行时,距离终点更近的车的到达时间不会被远车影响,因此我们可以考虑从后往前考虑车的到达情况。
从后往前,先计算当前车的到达时间,如果后面的车的到达时间比当前车短,则两者相遇,车队数目减一,到达时间不变。如果后面的车的到达时间长,则两者不相遇,车队数目不变。

代码

  1. class Solution {
  2. public:
  3. typedef pair<int, int> PII;
  4. int carFleet(int target, vector<int>& position, vector<int>& speed) {
  5. int n = position.size();
  6. vector<PII> data;
  7. for (int i = 0; i < n; i ++) {
  8. data.push_back({position[i], speed[i]});
  9. }
  10. sort(data.begin(), data.end());
  11. int ans = n;
  12. double time = 0, eps = 1e-6;
  13. for (int i = n - 1; i >= 0; i --) {
  14. // cout << i << endl;
  15. double tmp = (target - data[i].first) / (double)data[i].second;
  16. if (tmp > time + eps) {
  17. time = tmp;
  18. } else {
  19. ans --;
  20. }
  21. }
  22. return ans;
  23. }
  24. };