649. Dota2 Senate

649. Dota2 Senate

Question

In the world of Dota2, there are two parties: the Radiant and the Dire.

The Dota2 senate consists of senators coming from two parties. Now the Senate wants to decide on a change in the Dota2 game. The voting for this change is a round-based procedure. In each round, each senator can exercise one of the two rights:

  • Ban one senator’s right: A senator can make another senator lose all his rights in this and all the following rounds.
  • Announce the victory: If this senator found the senators who still have rights to vote are all from the same party, he can announce the victory and decide on the change in the game.

Given a string senate representing each senator’s party belonging. The character 'R' and 'D' represent the Radiant party and the Dire party. Then if there are n senators, the size of the given string will be n.

The round-based procedure starts from the first senator to the last senator in the given order. This procedure will last until the end of voting. All the senators who have lost their rights will be skipped during the procedure.

Suppose every senator is smart enough and will play the best strategy for his own party. Predict which party will finally announce the victory and change the Dota2 game. The output should be "Radiant" or "Dire".

Solution

用一个真值数组记录投票权,并使用n表示可投票人数,记录D阵营和R阵营的可投票人数。

循环遍历字符串,直到剩余人数n为1或某个阵营不再有可投票人数。

如果当前位置没有投票权则跳过。

如果相对阵营具有d或r具有可投票权,则减少对应票数,并将当前阵营的位置投票权标记为false。

否则将可投票数d或r加一。

最后根据剩余阵容人数返回阵营。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public String predictPartyVictory(String senate) {
boolean[] vote = new boolean[senate.length()];
int r = 0, d = 0, n = senate.length();
int totalR = 0, totalD = 0;
char cur = ' ';
for(int i = 0; i < senate.length(); i++){
vote[i] = true;
if(senate.charAt(i) == 'R') totalR++;
else totalD++;
}
while(n > 1 && totalD > 0 && totalR > 0){
for(int i = 0; i < senate.length(); i++){
if(!vote[i]) continue;
cur = senate.charAt(i);
if(cur == 'R'){
if(d > 0){
vote[i] = false;
totalR--;
d--;
n--;
}
else{
r++;
}
}
else if(cur == 'D'){
if(r > 0){
vote[i] = false;
totalD--;
r--;
n--;
}
else{
d++;
}
}
}
}

return totalD > 0 ? "Dire" : "Radiant";
}
}
Author

Xander

Posted on

2023-05-04

Updated on

2023-05-08

Licensed under

Comments