【LeetCode75】第二十八题(649)Dota2参议院

目录

题目:

示例:

分析:

代码+运行结果:


题目:

示例:

分析:

那么分析一下题目,首先,我不打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";
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值