Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)app
Dota2 参议院由来自两派的参议员组成。如今参议院但愿对一个 Dota2 游戏里的改变做出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员均可以行使两项权利中的一项:spa
禁止一名参议员的权利:code
参议员可让另外一位参议员在这一轮和随后的几轮中丧失全部的权利。blog
宣布胜利:队列
若是参议员发现有权利投票的参议员都是同一个阵营的,他能够宣布胜利并决定在游戏中的有关变化。游戏
给定一个字符串表明每一个参议员的阵营。字母 “R” 和 “D” 分别表明了 Radiant(天辉)和 Dire(夜魇)。而后,若是有 n 个参议员,给定字符串的大小将是 n。字符串
以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。全部失去权利的参议员将在过程当中被跳过。it
假设每一位参议员都足够聪明,会为本身的政党作出最好的策略,你须要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。io
示例 1:class
输入: "RD"
输出: "Radiant"
解释: 第一个参议员来自 Radiant 阵营而且他可使用第一项权利让第二个参议员失去权力,所以第二个参议员将被跳过由于他没有任何权利。而后在第二轮的时候,第一个参议员能够宣布胜利,由于他是惟一一个有投票权的人
示例 2:
输入: "RDD"
输出: "Dire"
解释:
第一轮中,第一个来自 Radiant 阵营的参议员可使用第一项权利禁止第二个参议员的权利
第二个来自 Dire 阵营的参议员会被跳过由于他的权利被禁止
第三个来自 Dire 阵营的参议员可使用他的第一项权利禁止第一个参议员的权利
所以在第二轮只剩下第三个参议员拥有投票的权利,因而他能够宣布胜利
想法: 别人写的代码真是美观, 本身和solution的想法大概一致
就是有限ban掉对方阵营下一个投票的人;
solution用到了循环队列, 以及01表示,真的史好简洁~~
from collections import deque class Solution(object): def predictPartyVictory(self, senate): people, ban = [0, 0], [0, 0] q = deque() for it in senate: x = it == 'R' people[x] += 1 q.append(x) while all(people): x = q.popleft() if ban[x]: ban[x] -= 1 people[x] -= 1 else: ban[x^1] += 1 q.append(x) return 'Radiant' if people[1] else 'Dire'