假设在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
让我们看下面的实现以更好地理解-
#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