In the world of Dota2, there are two parties: the Radiant and the Dire.

The Dota2 senate consists of senators coming from two parties. Now the senate wants to make a decision about a change in the Dota2 game. The voting for this change is a round-based procedure. In each round, each senator can exercise one of the two rights:

  1. Ban one senator's right
    A senator can make another senator lose all his rights in this and all the following rounds.
  2. Announce the victory
    If this senator found the senators who still have rights to vote are all from the same party, he can announce the victory and make the decision about the change in the game.

Given a string representing each senator's party belonging. The character 'R' and 'D' represent the Radiant party and the Dire party respectively. Then if there are n senators, the size of the given string will be n.

The round-based procedure starts from the first senator to the last senator in the given order. This procedure will last until the end of voting. All the senators who have lost their rights will be skipped during the procedure.

Suppose every senator is smart enough and will play the best strategy for his own party, you need to predict which party will finally announce the victory and make the change in the Dota2 game. The output should be Radiant or Dire.

Example 1:

Input: "RD"
Output: "Radiant"
Explanation: The first senator comes from Radiant and he can just ban the next senator's right in the round 1.
And the second senator can't exercise any rights any more since his right has been banned.
And in the round 2, the first senator can just announce the victory since he is the only guy in the senate who can vote.

Example 2:

Input: "RDD"
Output: "Dire"
Explanation:
The first senator comes from Radiant and he can just ban the next senator's right in the round 1.
And the second senator can't exercise any rights anymore since his right has been banned.
And the third senator comes from Dire and he can ban the first senator's right in the round 1.
And in the round 2, the third senator can just announce the victory since he is the only guy in the senate who can vote.

Note:

  1. The length of the given string will in the range [1, 10,000].

该来的总会来!!!自从上次LeetCode拿提莫出题Teemo Attacking后,我就知道刀塔早晚也难逃魔掌,这道题直接就搞起了刀塔二。不过话说如果你是从魔兽3无缝过渡到刀塔,那么应该熟悉了两个阵营的叫法,近卫和天灾。刀塔二里面不知道搞什么鬼,改成了光辉和梦魇,不管了,反正跟这道题的解法没什么关系。这道题模拟了刀塔类游戏开始之前的BP过程,两个阵营按顺序Ban掉对方的英雄,看最后谁剩下来了,就返回哪个阵营。那么博主能想到的简单暴力的方法就是先统计所有R和D的个数,然后从头开始遍历,如果遇到了R,就扫描之后所有的位置,然后还要扫描R前面的位置,这就要用到数组的环形遍历的知识了,其实就是坐标对总长度取余,使其不会越界,如果我们找到了下一个D,就将其标记为B,然后对应的计数器cntR自减1。对于D也是同样处理,我们的while循环的条件是cntR和cntD都要大于0,当有一个等于0了的话,那么推出循环,返回那个不为0的阵营即可,参见代码如下:

解法一:

class Solution {
public:
string predictPartyVictory(string senate) {
int n = senate.size(), cntR = , cntD = ;
for (char c : senate) {
c == 'R' ? ++cntR : ++cntD;
}
if (cntR == ) return "Dire";
if (cntD == ) return "Radiant";
while (cntR > && cntD > ) {
for (int i = ; i < n; ++i) {
if (senate[i] == 'R') {
for (int j = i + ; j < i + n; ++j) {
if (senate[j % n] == 'D') {
senate[j % n] = 'B';
--cntD;
break;
}
}
} else if (senate[i] == 'D') {
for (int j = i + ; j < i + n; ++j) {
if (senate[j % n] == 'R') {
senate[j % n] = 'B';
--cntR;
break;
}
}
}
}
}
return cntR != ? "Radiant" : "Dire";
}
};

上面的暴力搜索的方法略显复杂,我们其实有更好的方法来做,我们可以用两个队列queue,把各自阵营的位置存入不同的队列里面,然后进行循环,每次从两个队列各取一个位置出来,看其大小关系,小的那个说明在前面,就可以把后面的那个Ban掉,所以我们要把小的那个位置要加回队列里面,但是不能直接加原位置,因为下一轮才能再轮到他来Ban,所以我们要加上一个n,再排入队列。这样当某个队列为空时,推出循环,我们返回不为空的那个阵营,参见代码如下:

解法二:

class Solution {
public:
string predictPartyVictory(string senate) {
int n = senate.size();
queue<int> q1, q2;
for (int i = ; i < n; ++i) {
(senate[i] == 'R') ? q1.push(i) : q2.push(i);
}
while (!q1.empty() && !q2.empty()) {
int i = q1.front(); q1.pop();
int j = q2.front(); q2.pop();
(i < j) ? q1.push(i + n) : q2.push(j + n);
}
return (q1.size() > q2.size()) ? "Radiant" : "Dire";
}
};

类似题目:

Teemo Attacking

参考资料:

https://discuss.leetcode.com/topic/97671/java-c-very-simple-greedy-solution-with-explanation

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Dota2 Senate 刀塔二参议院的更多相关文章

  1. [Swift]LeetCode649. Dota2 参议院 | Dota2 Senate

    In the world of Dota2, there are two parties: the Radiantand the Dire. The Dota2 senate consists of ...

  2. 【LeetCode】649. Dota2 Senate 解题报告(Python)

    [LeetCode]649. Dota2 Senate 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地 ...

  3. 649. Dota2 Senate

    In the world of Dota2, there are two parties: the Radiant and the Dire. The Dota2 senate consists of ...

  4. Leetcode 063 不同路径二

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...

  5. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  6. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  7. 【python】Leetcode每日一题-二叉搜索迭代器

    [python]Leetcode每日一题-二叉搜索迭代器 [题目描述] 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(T ...

  8. [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence

    一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...

  9. [LeetCode] Split BST 分割二叉搜索树

    Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...

随机推荐

  1. kvm之四:从网上镜像安装虚拟机Centos6.8

    1.再加块硬盘,格式化挂载至新建目录/kvm2下 2.CentOS 6.8镜像地址 http://mirrors.163.com/centos/6.8/os/x86_64/ 3.配置安装参数,执行安装 ...

  2. 03-第一个脚本程序以及输入输出_Python编程之路

    上节课已经教大家安装了Python的解释器,那么这节课我们就可以正式来写代码了 说明:在下面的代码演示中,我将大部分使用python交互器演示代码的输入输出,注意">>>& ...

  3. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  4. 敏捷冲刺每日报告三(Java-Team)

    第三天报告(10.27  周五) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  5. Flask 学习 十二 用户评论

    评论在数据库中的表示 由于评论和2个模型有关系,分别是谁发了评论,以及评论了哪个文章,所以这次要更新数据库模型 models.py 创建用户评论数据库模型 class Comment(db.Model ...

  6. CentOS7安装配置iptables防火墙

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/50779761 CentOS7默认的防火墙不是iptables,而是firewall ...

  7. day-5 python协程与I/O编程深入浅出

    基于python编程语言环境,重新学习了一遍操作系统IO编程基本知识,同时也学习了什么是协程,通过实际编程,了解进程+协程的优势. 一.python协程编程实现 1.  什么是协程(以下内容来自维基百 ...

  8. Android广播发送失败

    现在至今为止Android 8.0 不支持大部分广播收发 如果无法使用建议换至Android 7.0版本 且 minSdkVersion 24

  9. 深度学习之 mnist 手写数字识别

    深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...

  10. SQL Server(MySql)中的联合主键(联合索引) 索引分析

    最近有人问到这个问题,之前也一直没有深究联合索引具体使用逻辑,查阅多篇文章,并经过测试,得出一些结论 测试环境:SQL Server 2008 R2 测试结果与MySql联合索引查询机制类似,可以认为 ...