目录
题目:
示例:
分析:
那么分析一下题目,首先,我不打DOTA2,这题没法做,分析完毕。
给一个数组表示一个参议员,按照从左到右的顺序开始行使权利,权利就是可以禁止另一个参议员的权利。假设每个参议员都会做出最好的决策。求,在最后,还会剩下哪一个阵营的参议员。
那么这道题可以直接模拟,我们就模拟他们参议员行使权利。
首先我们先明确一点,什么是最好的决策。最好的决策就是把下一个离自己最近的其他阵营的参议员干掉,这样在本轮中,敌方阵营就会少掉一次干掉本方阵营的机会,如果往后没有敌对阵营了,那么就把数组开始的第一个敌方阵营的参议员干掉。
能理解最好决策之后,写代码就是体力活了,可以参考下面的代码。
代码+运行结果:
class Solution {
public:
bool check(string& senate){ //检查是否整个参议院都是同一个阵营
for(auto& s:senate){
if(s!=senate[0]) return false;
}
return true;
}
string predictPartyVictory(string senate) {
int cur=0;
int index=0;
while(!check(senate)){
index=cur+1;
//往后找出第一个不同阵营的参议员
while(index<senate.size()&&senate[index]==senate[cur]) index++;
//如果往后找不到,那就从开头找
if(index==senate.size()){
for(int i=0;i<cur;i++){
if(senate[i]!=senate[cur]){ //找到不一样的参议员就干掉
senate.erase(i,1);
break;
}
}
}else senate.erase(index,1); //干掉后面第一个不一样的参议员
if(cur>=senate.size()-1) cur=0; //如果当前下标大于等于数组长度了就置0从头开始
else cur++;
}
return senate[0]=='R'?"Radiant":"Dire";
}
};