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

C++에서 쌍 사슬의 최대 길이


Dota2의 세계에는 The Radiant와 Dire라는 두 개의 파티가 있다고 가정해 보겠습니다. Dota2 상원은 두 정당에서 온 상원의원으로 구성됩니다. 이제 상원은 Dota2 게임 내에서 몇 가지 변경 사항을 선택하려고 합니다. 이 변경에 대한 투표는 라운드 기반 절차일 수 있습니다. 각 라운드에서 각 상원의원은 다음 두 가지 권리 중 하나를 행사할 수 있습니다.

  • 한 상원의원의 권리 금지 - 상원의원은 이번 라운드와 이후 라운드에서 다른 상원의원이 자신의 모든 권리를 잃게 만들 수 있습니다.

  • 승리 선언 - 이 상원의원이 아직 투표권이 있는 상원 의원이 모두 동등한 정당 출신임을 발견하면 게임 내에서 승리를 선언하고 변경 사항을 선택할 수 있습니다.

각 상원의원의 정당을 나타내는 문자열이 제공됩니다. 문자 'R'과 'D'는 각각 Radiant 파티와 Dire 파티를 나타냅니다. 그런 다음 n명의 상원 의원이 있는 경우 주어진 문자열의 차원은 n이 됩니다.

라운드 기반 절차는 주 상원의원부터 지정된 순서 내에서 마지막 상원의원까지 시작됩니다. 이 절차는 투표가 끝날 때까지 지속됩니다. 권리를 상실한 모든 상원의원은 절차에서 생략됩니다.

모든 상원의원이 충분히 현명하고 자신의 정당을 위해 가장 간단한 전략을 사용할 수 있다고 가정하면, Dota2 게임 내에서 어느 정당이 최종적으로 승리를 선언하고 변경을 할 것인지 예측하고 싶습니다. 출력은 Radiant 또는 Dire여야 합니다.

따라서 입력이 "RDD"와 같으면 Dire가 됩니다. 첫 번째 상원의원은 Radiant에서 나왔고 1라운드에서 차기 상원의원의 권리를 금지할 수 있기 때문입니다. 그리고 두 번째 상원의원은 권리가 금지되어 더 이상 권리를 행사할 수 없습니다. 그 후 세 번째 상원의원은 Dire에서 와서 1라운드에서 첫 번째 상원의원의 권리를 금지할 수 있습니다. 이제 라운드 2에서 세 번째 상원의원은 상원에서 투표할 수 있는 유일한 사람이므로 승리를 발표할 수 있습니다.

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

  • 큐 q1, q2, n :=문자열 크기를 만듭니다. 모든 R의 경우 q1에 삽입하고 모든 D의 경우 q2에 삽입합니다.

  • 두 대기열이 모두 비어 있지 않은 동안

    • q1의 앞 요소

      • n을 q1에 삽입하고 q2와 q1에서 삭제

    • 그렇지 않으면 n을 q2에 삽입하고 q2와 q1에서 삭제

    • n을 1 증가

  • 대기열이 비어 있으면 Dire를 반환하고, 그렇지 않으면 Radiant를 반환합니다.

예시(C++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string predictPartyVictory(string s) {
      queue <int> q1, q2;
      int n = s.size();
      for(int i = 0; i < s.size(); i++){
         if(s[i] == 'R'){
            q1.push(i);
         } else {
            q2.push(i);
         }
      }
      while(q1.size() && q2.size()){
         if(q1.front() < q2.front()){
            q1.push(n);
            q2.pop();
            q1.pop();
         } else {
            q2.push(n);
            q2.pop();
            q1.pop();
         }
         n++;
      }
      return q1.empty()? "Dire" : "Radiant";
   }
};
main(){
   Solution ob;
   cout <<(ob.predictPartyVictory("RDD"));
}

입력

"RDD"

출력

Dire