Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 자동차 함대

<시간/>

1차선 도로를 따라 같은 목적지로 가는 N 대의 자동차가 있다고 가정합니다. 목적지는 '목표' 마일 떨어져 있습니다. 이제 각 자동차 i는 일정한 속도 값 속도[i](시간당 마일)를 가지며 초기 위치는 도로를 따라 목표물을 향한 위치[i]마일입니다.

차는 앞의 다른 차를 절대 추월할 수 없지만 같은 속도로 앞범퍼를 따라잡을 수 있습니다. 여기에서 이 두 자동차 사이의 거리는 무시됩니다. 두 자동차는 같은 위치에 있다고 가정합니다. 자동차 함대는 동일한 위치와 속도로 주행하는 비어 있지 않은 자동차 세트입니다. 한 대의 차량이 목적지 지점에서 차량 함대를 따라잡더라도 여전히 한 대의 차량으로 간주됩니다. 따라서 목적지에 도착할 차량 수를 찾아야 합니다.

따라서 목표가 12이고 위치가 [10,8,0,5,3]이고 속도가 [2,4,1,1,3]이면 출력은 3이 됩니다. 이는 자동차가 10에서 시작하기 때문입니다. 그리고 8은 플릿이 되어 12시에 서로 만납니다. 이제 0에서 시작하는 차는 다른 차를 따라가지 못하므로 그 자체로 플릿입니다. 다시 5시와 3시에 출발하는 차량은 함대가 되어 6시에 서로를 만납니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 배열 v, n :=위치 배열 p의 크기
  • 0 ~ n – 1 범위의 i에 대해
    • v에 (p[i], s[i]) 삽입
  • ret :=n
  • v 배열 정렬
  • 스택 st 정의
  • 0 ~ n – 1 범위의 i에 대해
    • temp :=(t – v[i]의 첫 번째 요소) / v[i]의 두 번째 요소
    • st가 비어 있지 않고 스택 상단 <=temp
      • ret 1 감소
      • st에서 최상위 요소 삭제
    • st에 온도 삽입
  • 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int carFleet(int t, vector<int>& p, vector<int>& s) {
      vector < pair <double, double> > v;
      int n = p.size();
      for(int i = 0; i < n; i++){
         v.push_back({p[i], s[i]});
      }
      int ret = n;
      sort(v.begin(), v.end());
      stack <double> st;
      for(int i = 0; i < n; i++){
         double temp = (t - v[i].first) / v[i].second;
         while(!st.empty() && st.top() <= temp){
            ret--;
            st.pop();
         }
         st.push(temp);
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {10, 8, 0, 5, 3};
   vector<int> v2 = {2,4,1,1,3};
   Solution ob;
   cout << (ob.carFleet(12, v1, v2));
}

입력

12
[10,8,0,5,3]
[2,4,1,1,3]

출력

3