|
| 1 | +packagecom.fishercoder.solutions; |
| 2 | + |
| 3 | +importjava.util.LinkedList; |
| 4 | +importjava.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 | +publicclass_649 { |
| 53 | + |
| 54 | +publicStringpredictPartyVictory(Stringsenate) { |
| 55 | +Queue<Integer>radiantQ =newLinkedList<>(); |
| 56 | +Queue<Integer>direQ =newLinkedList<>(); |
| 57 | +intlen =senate.length(); |
| 58 | +for (inti =0;i <len;i++) { |
| 59 | +if (senate.charAt(i) =='R')radiantQ.offer(i); |
| 60 | +elsedireQ.offer(i); |
| 61 | + } |
| 62 | +while (!radiantQ.isEmpty() && !direQ.isEmpty()) { |
| 63 | +intradiantIndex =radiantQ.poll(); |
| 64 | +intdireIndex =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 | +returnradiantQ.isEmpty() ?"Dire" :"Radiant"; |
| 73 | + } |
| 74 | +} |