题目链接: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; } } } } }