C ++中的配对链的最大长度
禁止一位参议员的权利-一位参议员可以使另一位参议员在本回合中失去其所有权利,而在随后的回合中,每一位参议员都将丧失其所有权利。
宣布胜利-如果该参议员发现仍然具有投票权的参议员全部来自同一个政党,则他可以宣布胜利并在游戏中进行更改。
给定一个代表每个参议员党所属的字符串。字符“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