算法

·

3 min read

·

- Views

649. Dota2 参议院

Copied

649. Dota2 参议院

Q:

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)

Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的 一 项:

  • 禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失 所有的权利 
  • 宣布胜利:如果参议员发现有权利投票的参议员都是 同一个阵营的 ,他可以宣布胜利并决定在游戏中的有关变化。

给你一个字符串 senate 代表每个参议员的阵营。字母 'R' 和 'D'分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n

以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。

假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 "Radiant" 或 "Dire" 。

示例 1:

示例 2:

思路

模拟这个过程。

首先统计一下R阵营和D阵营的总数。 这样方便在模拟过程中用来判断当某个阵营人数为0 则另一个阵营胜利。

然后模拟投票过程。 因为投票会有好几轮。所有外层需要while循环,表示不同轮数。

我们需要维护一个整体的被禁用的数组,表示某个Index的议员被禁用了

遍历字符串,如果当前议员是’R‘, 那么下一个’D‘将被禁用。 但是考虑会有连续的好几个R, 因此我们还得维护一个未被禁用的D议员数dPreventCount未被禁用的R议员数rPreventCount 。 这样当我们遍历到某个议员时,如果存在该类型的未被禁用数,那么该议员将被禁用。

注意在模拟过程中当判断出议员被禁用时需要更新R阵营的总数和D阵营的总数

Code