leetcode 649. Dota2 參議院

Dota2 的世界裏有兩個陣營:Radiant(天輝)和 Dire(夜魘)app

Dota2 參議院由來自兩派的參議員組成。如今參議院但願對一個 Dota2 遊戲裏的改變做出決定。他們以一個基於輪爲過程的投票進行。在每一輪中,每一位參議員均可以行使兩項權利中的一項:spa

禁止一名參議員的權利:code

參議員可讓另外一位參議員在這一輪和隨後的幾輪中喪失全部的權利。blog

宣佈勝利:隊列

          若是參議員發現有權利投票的參議員都是同一個陣營的,他能夠宣佈勝利並決定在遊戲中的有關變化。遊戲

 

給定一個字符串表明每一個參議員的陣營。字母 「R」 和 「D」 分別表明了 Radiant(天輝)和 Dire(夜魘)。而後,若是有 n 個參議員,給定字符串的大小將是 n。字符串

以輪爲基礎的過程從給定順序的第一個參議員開始到最後一個參議員結束。這一過程將持續到投票結束。全部失去權利的參議員將在過程當中被跳過。it

假設每一位參議員都足夠聰明,會爲本身的政黨作出最好的策略,你須要預測哪一方最終會宣佈勝利並在 Dota2 遊戲中決定改變。輸出應該是 Radiant 或 Dire。io

 

示例 1:class

輸入: "RD"
輸出: "Radiant"
解釋: 第一個參議員來自 Radiant 陣營而且他可使用第一項權利讓第二個參議員失去權力,所以第二個參議員將被跳過由於他沒有任何權利。而後在第二輪的時候,第一個參議員能夠宣佈勝利,由於他是惟一一個有投票權的人
示例 2:

輸入: "RDD"
輸出: "Dire"
解釋:
第一輪中,第一個來自 Radiant 陣營的參議員可使用第一項權利禁止第二個參議員的權利
第二個來自 Dire 陣營的參議員會被跳過由於他的權利被禁止
第三個來自 Dire 陣營的參議員可使用他的第一項權利禁止第一個參議員的權利
所以在第二輪只剩下第三個參議員擁有投票的權利,因而他能夠宣佈勝利

 

想法: 別人寫的代碼真是美觀, 本身和solution的想法大概一致 

    就是有限ban掉對方陣營下一個投票的人;

         solution用到了循環隊列, 以及01表示,真的史好簡潔~~

from collections import deque

class Solution(object):
    def predictPartyVictory(self, senate):
        people, ban = [0, 0], [0, 0]
        q = deque()
        for it in senate:
            x = it == 'R'
            people[x] += 1
            q.append(x)
        while all(people):
            x = q.popleft()
            if ban[x]:
                ban[x] -= 1
                people[x] -= 1
            else:
                ban[x^1] += 1
                q.append(x)
        return 'Radiant' if people[1] else 'Dire'
相關文章
相關標籤/搜索