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

C++에서 최소 급유 중지 수

<시간/>

출발 위치에서 출발 위치에서 동쪽으로 t마일 떨어진 목적지까지 이동하는 자동차가 있다고 가정합니다.

이제 길을 따라 많은 주유소가 있습니다. 따라서 각 스테이션[i]은 시작 위치에서 동쪽으로 스테이션[i][0]마일에 있는 주유소를 나타내며 해당 스테이션에는 주유소[i][1]리터가 있습니다.

자동차가 무한한 크기의 가스 탱크로 시작하는 경우 처음에는 연료 리터의 연료가 들어 있습니다. 주행하는 1마일당 1리터의 가스를 사용합니다.

차가 한 주유소에 도착하면 멈추고 연료를 보급할 수 있으므로 이제 주유소의 모든 주유소를 자동차로 옮깁니다. 차가 목적지에 도달하기 위해 거쳐야 하는 최소 주유 횟수는 얼마인지 찾아야 합니다. 목적지에 도달할 수 없는 경우 -1을 반환합니다.

따라서 입력이 Target =100, startFuel =20, 스테이션 =[10,40],[20,30],[30,20],[60,40]인 경우 출력은 3이 됩니다. 따라서 처음에는 10리터의 가스가 있고 첫 번째 스테이션에 도달한 후 40리터의 가스를 이송하므로 현재 (0 + 40) =40리터 가스가 있고 세 번째 스테이션에 도달하면 이제 20리터의 가스를 이송하므로 현재 수량은 (20+20) =40이고 마지막 스테이션에 도달하고 40리터의 가스를 취하므로 현재 수량(10 + 40) =50입니다. 지금까지 60마일을 이동했으므로 도달하려면 40마일을 더 가야 합니다. 목적지, 목표에 도달하기에 충분한 가스가 있습니다.

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

  • 커 :=0

  • 배열 st

    정렬
  • 우선순위 대기열 pq 정의

  • i :=0, cnt :=0

  • curr :=curr + 연료

  • 동안 curr

    • (cnt를 1씩 증가)

    • 동안 (i

      • pq에 st[i, 1] 삽입

      • (i를 1씩 증가)

    • pq가 비어 있으면 -

      • 루프에서 나오세요

    • curr :=curr + pq의 최상위 요소

    • pq에서 요소 삭제

  • return(curr>=target이면 cnt, 그렇지 않으면 -1)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minRefuelStops(int target, int fuel, vector<vector<int>> &st) {
      int curr = 0;
      sort(st.begin(), st.end());
      priority_queue<int> pq;
      int i = 0;
      int cnt = 0;
      curr += fuel;
      while (curr < target) {
         cnt++;
         while (i < st.size() && st[i][0] <= curr) {
            pq.push(st[i][1]);
            i++;
         }
         if (pq.empty())
            break;
         curr += pq.top();
         pq.pop();
      }
      return curr >= target ? cnt : -1;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{10,40},{20,30},{30,20},{60,40}};
   cout << (ob.minRefuelStops(100, 10, v));
}

입력

100, 10, {{10,40},{20,30},{30,20},{60,40}}

출력

3