|
| 1 | +package com.fishercoder.solutions; |
| 2 | + |
| 3 | +import java.util.LinkedList; |
| 4 | +import java.util.Queue; |
| 5 | + |
| 6 | +/** |
| 7 | + * 649. Dota2 Senate |
| 8 | + * |
| 9 | + * In the world of Dota2, there are two parties: the Radiant and the Dire. |
| 10 | +
|
| 11 | + The Dota2 senate consists of senators coming from two parties. |
| 12 | + Now the senate wants to make a decision about a change in the Dota2 game. |
| 13 | + The voting for this change is a round-based procedure. |
| 14 | + In each round, each senator can exercise one of the two rights: |
| 15 | +
|
| 16 | + 1. Ban one senator's right: |
| 17 | + A senator can make another senator lose all his rights in this and all the following rounds. |
| 18 | + 2. Announce the victory: |
| 19 | + If this senator found the senators who still have rights to vote are all from the same party, |
| 20 | + he can announce the victory and make the decision about the change in the game. |
| 21 | + Given a string representing each senator's party belonging. |
| 22 | + The character 'R' and 'D' represent the Radiant party and the Dire party respectively. |
| 23 | + Then if there are n senators, the size of the given string will be n. |
| 24 | +
|
| 25 | + The round-based procedure starts from the first senator to the last senator in the given order. |
| 26 | + This procedure will last until the end of voting. |
| 27 | + All the senators who have lost their rights will be skipped during the procedure. |
| 28 | +
|
| 29 | + Suppose every senator is smart enough and will play the best strategy for his own party, |
| 30 | + you need to predict which party will finally announce the victory and make the change in the Dota2 game. |
| 31 | + The output should be Radiant or Dire. |
| 32 | +
|
| 33 | + Example 1: |
| 34 | + Input: "RD" |
| 35 | + Output: "Radiant" |
| 36 | + Explanation: The first senator comes from Radiant and he can just ban the next senator's right in the round 1. |
| 37 | + And the second senator can't exercise any rights any more since his right has been banned. |
| 38 | + And in the round 2, the first senator can just announce the victory since he is the only guy in the senate who can vote. |
| 39 | +
|
| 40 | + Example 2: |
| 41 | + Input: "RDD" |
| 42 | + Output: "Dire" |
| 43 | + Explanation: |
| 44 | + The first senator comes from Radiant and he can just ban the next senator's right in the round 1. |
| 45 | + And the second senator can't exercise any rights anymore since his right has been banned. |
| 46 | + And the third senator comes from Dire and he can ban the first senator's right in the round 1. |
| 47 | + And in the round 2, the third senator can just announce the victory since he is the only guy in the senate who can vote. |
| 48 | + Note: |
| 49 | + The length of the given string will in the range [1, 10,000]. |
| 50 | +
|
| 51 | + */ |
| 52 | +public class _649 { |
| 53 | + |
| 54 | + public String predictPartyVictory(String senate) { |
| 55 | + Queue<Integer> radiantQ = new LinkedList<>(); |
| 56 | + Queue<Integer> direQ = new LinkedList<>(); |
| 57 | + int len = senate.length(); |
| 58 | + for (int i = 0; i < len; i++) { |
| 59 | + if (senate.charAt(i) == 'R') radiantQ.offer(i); |
| 60 | + else direQ.offer(i); |
| 61 | + } |
| 62 | + while (!radiantQ.isEmpty() && !direQ.isEmpty()) { |
| 63 | + int radiantIndex = radiantQ.poll(); |
| 64 | + int direIndex = direQ.poll(); |
| 65 | + if (radiantIndex < direIndex) { |
| 66 | + /**Radiant will ban Dire in this case, so we'll add radiant index back to the queue plus n*/ |
| 67 | + radiantQ.offer(radiantIndex + len); |
| 68 | + } else { |
| 69 | + direQ.offer(direIndex + len); |
| 70 | + } |
| 71 | + } |
| 72 | + return radiantQ.isEmpty() ? "Dire" : "Radiant"; |
| 73 | + } |
| 74 | +} |
0 commit comments