C ++中的配对链的最大长度

假设在Dota2的世界中,有两个参与方-The Radiant和Dire。Dota2参议院由来自两党的参议员组成。现在,参议院希望在Dota2游戏中做出一些改变的选择。对该变更的投票可以是基于回合的过程。在每个回合中,每个参议员可以行使两项权利中的一项-

  • 禁止一位参议员的权利-一位参议员可以使另一位参议员在本回合中失去其所有权利,而在随后的回合中,每一位参议员都将丧失其所有权利。

  • 宣布胜利-如果该参议员发现仍然具有投票权的参议员全部来自同一个政党,则他可以宣布胜利并在游戏中进行更改。

给定一个代表每个参议员党所属的字符串。字符“ R”和“ D”分别表示“辐射方”和“可怕方”。然后,如果有n个参议员,则给定弦的尺寸将为n。

基于回合的过程从给定顺序中的主要参议员开始到最后一个参议员。此过程将持续到投票结束为止。在程序中将跳过所有失去权利的参议员。

假设每个参议员都足够明智,并且可以为自己的政党采取最简单的策略,那么您希望预测哪个政党最终会宣布胜利并在Dota2游戏中做出改变。输出应为Radiant或Dire。

因此,如果输入类似于“ RDD”,则为Dire。这是因为第一位参议员来自Radiant,他可以在第一轮中禁止第二位参议员的权利。第二位参议员由于其权利被禁止而不再行使任何权利。之后,第三位参议员来自Dire,他可以在第一回合中禁止第一位参议员的权利。现在,在第二回合中,第三位参议员可以宣布胜利,因为他是参议院中唯一可以投票的人。

为了解决这个问题,我们将遵循以下步骤-

  • 使队列q1,q2,n:=字符串大小。对于所有R,请插入q1,对于所有D,请插入q2。

  • 当两个队列都不为空时

    • 将n插入q1,从q2和q1中删除

    • 如果q1的前元素<q2的前元素,则

    • 否则将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