题目链接
Dota2 参议院
题目描述
注意点
- senate[i] 为 ‘R’ 或 ‘D’
- 假设每一位参议员都足够聪明,会为自己的政党做出最好的策略
解答思路
- 对于任意一位参议员,如果其有权利,当他后面没有另一方参议员,其会投票,该阵营获胜;如果后面有另一方参议员,其会禁止后方第一个另一方参议员的权利,这样能保证其会为自己的政党做出最好的策略
- 使用两个队列分别存储Radiant和Dire阵营所处的位置。将位置都存储进队列后,每次将两个队列队首弹出,位置靠前阵营的参议员h1可以禁止另一个阵营的参议员h2,并且其下一轮可以进行投票(取决于另一个阵营有没有多余的参议员能禁止该参议员h1),所以在弹出后还要添加到队列末尾,一直循环该操作直到某个队列为空,另一个队列对应的阵营获胜
代码
class Solution {
public String predictPartyVictory(String senate) {
int n = senate.length();
Deque<Integer> dDeque = new ArrayDeque<>();
Deque<Integer> rDeque = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (senate.charAt(i) == 'D') {
dDeque.offerLast(i);
}
if (senate.charAt(i) == 'R') {
rDeque.offerLast(i);
}
}
while (!dDeque.isEmpty() && !rDeque.isEmpty()) {
int dIdx = dDeque.pollFirst();
int rIdx = rDeque.pollFirst();
if (dIdx < rIdx) {
dDeque.offerLast(dIdx + n);
} else {
rDeque.offerLast(rIdx + n);
}
}
return dDeque.isEmpty() ? "Radiant" : "Dire";
}
}
关键点
- 位于前面的参议员优先禁止后方另一阵营的参议员
- 当同一轮后方某一方的参议员足够多时,可以禁止前方的另一方参议员
- 当某个参议员禁止另一个参议员权利后,其既有可能在下一轮参与投票,也有可能被后方的某个参议员禁止权利,所以在将该参议员从队列中弹出后,还要将其位置加上n后添加到队列末尾(同一轮后方另一个阵营参议员可以禁止其权利)