649. Dota2 参议院
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:
- 禁止一名参议员的权利:
- 参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。
宣布胜利:
如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。
给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。
以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。
假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。
这道题需要考虑两个问题,议员的数量和顺序,我开始的思路是用字典结构来做的,由于没有很好地考虑顺序问题**失败了!!!**代码如下:
class Solution:
def predictPartyVictory(self, senate: str) -> str:
senateId={'R':True,'D':False}
senateMap={True:0,False:0}
team={True:"Radiant",False:"Dire"}
for i in senate:
senateMap[senateId[i]]+=1
while(True):
tmpMap=senateMap.copy()
for i in senate:
index=senateId[i]
index2=not index
if tmpMap[index]>0:
if tmpMap[index2]>0:
tmpMap[index]-=1
tmpMap[index2]-=1
senateMap[index2]-=1
elif senateMap[index2]>0:
tmpMap[index]-=1
senateMap[index2]-=1
else:
return team[index]
参考了官方解题,是使用的队列(即可以考虑顺序也可以考虑数量),具体代码如下(C++版):
class Solution {
public:
string predictPartyVictory(string senate) {
int n=senate.length();
queue<int> Radiant,Dire;
for(int i = 0; i < n; ++i)
{
if(senate[i] == 'D') Dire.push(i);
else Radiant.push(i);
}
while(!Radiant.empty() && !Dire.empty())
{
if(Radiant.front()<Dire.front()) Radiant.push(Radiant.front()+n);
else Dire.push(Dire.front()+n);
Radiant.pop();
Dire.pop();
}
return !Radiant.empty() ? "Radiant" : "Dire";
}
};
运行效果:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/dota2-senate