649.Dota2参议院

题目链接:649. Dota2 参议院

思路:题目假设每个人能够作出最优决定,那么,当前参议员能够作出决定时,他一定是禁用他下一位另一派的参议员,这样才能保证己方能够处于优势地位。那么设banOfR和banOfD分别为R和D被禁的人数,每次遍历只需判断当前数是否有权利,没有权利说明他被上一位其他派的议员禁了。

代码:

class Solution {
    public String predictPartyVictory(String senate) {
        int[] power = new int[senate.length()];//0表示有权力投票,1表示没有
        int banOfR,banOfD;
        banOfD=banOfR=0;
        for(;;){
            int numOfR, numOfD;
            numOfD=numOfR=0;
            for(int i=0; i<senate.length(); i++){//统计投票人数
                if(power[i]==0){
                    if(senate.charAt(i) == 'R') numOfR++;
                    else numOfD++;
                }
            }
            for(int i=0; i<senate.length(); i++){
                if(power[i] == 1) continue;
                switch(senate.charAt(i)){
                    case'R': 
                        if(banOfR>0){//当前人是被禁的
                            power[i] = 1;//更新状态
                            banOfR--;
                            numOfR--;
                        }else{
                            banOfD++;//当前人禁掉另一派的人
                        }
                        if(numOfD<=0) return "Radiant";//另一派人数为0,宣布当前派获胜
                        break;
                    case'D':
                        if(banOfD>0){
                            power[i]=1;
                            banOfD--;
                            numOfD--;
                        }else{
                            banOfR++;
                        }
                        if(numOfR<=0) return "Dire";
                        break;
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/liuyongyu/p/14119593.html