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

C++의 전구 전환기 III


n개의 전구가 있는 방이 있다고 가정해 보겠습니다. 전구는 1에서 n까지 번호가 매겨져 있고 왼쪽에서 오른쪽으로 일렬로 배열되어 있습니다. 처음에는 모든 전구가 꺼집니다. 순간 k(범위 0에서 n - 1의 k에 대해)에서 전구[k] 전구를 켭니다. 전구가 켜져 있고 이전 전구(왼쪽)도 모두 켜져 있는 경우에만 전구의 색이 파란색으로 바뀝니다. 켜진 전구가 모두 파란색이 되는 순간의 수를 찾아야 합니다. 이것은 예입니다 -

C++의 전구 전환기 III

모멘트가 1, 2, 4이므로 출력은 3이 됩니다.

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

  • ret :=0, 세트 x 정의, n :=목록 배열의 크기, 맵 정의 m

  • 최대 힙 기반 우선 순위 큐 pq 정의

  • 0 ~ n – 1 범위의 I

    • m[light[i]] :=i 및 pq에 i 삽입

  • 범위 1에서 n까지의 I에 대해

    • x에 m[i] 삽입

    • pq가 비어 있지 않고 pq의 최상위 요소가 집합 x에 있는 동안

      • pq에서 삭제

    • ret :=ret + 1(pq가 비어 있거나 pq>=i의 맨 위)일 때, 그렇지 않으면 0

  • 반환 해상도

예시(C++)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int numTimesAllBlue(vector<int>& light) {
      int ret = 0;
      set <int> x;
      int n = light.size();
      map <int, int> m;
      priority_queue <int, vector <int>, greater <int> > pq;
      for(int i = 0; i < n; i++){
         m[light[i]] = i;
         pq.push(i);
      }
      for(int i = 1; i <=n; i++){
         x.insert(m[i]);
         while(!pq.empty() && x.count(pq.top()))pq.pop();
         ret += (pq.empty() || (pq.top() >= i));
      }
      return ret;
   }
};
main(){
   vector<int> v = {2,1,3,5,4};
   Solution ob;
   cout << (ob.numTimesAllBlue(v));
}

입력

[2,1,3,5,4]

출력

3