Dota2 参议院

  • 题目描述
  • 思路
    • 思路一
    • 思路二
    • 思路三(参考官方解答)
  • 代码(CPP)
    • 思路一实现
    • 思路二实现
    • 思路三实现

题目描述

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现参议院希望对一个 Dota2 游戏里的改变作决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:

禁止一名参议员的权利:

参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。

宣布胜利:

如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。

给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。

以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。

假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dota2-senate

思路

参议员行使禁止权一定是禁止依序(环状)离自己最近的对方阵营参议员,否则该对方阵营参议员就会先禁止该阵营的参议员

思路一

  1. 用一个vector记录每轮每个参议员行使权利后,每位参议院的状态(1:仍可行使权利;0:丧失所有权利),初始全部为1
  2. 把形参参议员字符串看成是环形的,任意一位正在行使权利的参议员从自己开始向后遍历,直到找到和自己不同阵营且仍有权利的参议员为止,行使禁止权(将vector中这位参议员的状态修改为0)
  3. 若遍历的结果指向该参议员本身,则说明剩余参议员全部为相同阵营的,该参议员行使宣布胜利权,结束循环

注:该实现的时间复杂度较高,可进行如下修改:

思路二

  1. 不使用vector保存其参议员状态,而是只要某位参议员被使用了禁止权利后,即将其从senate中除去

思路三(参考官方解答)

  1. 使用两个队列模拟两个阵营的参议员依序行使权利,队列中保存每位参议员行使权利的时间
  2. 比较两个队列头的时间大小:小的那位参议员行使权利,从队列头pop出来,再加上senate.length(所有参议员人数)后入队准备下一轮行使权利;大的那位参议员被永久pop出自己的队列
  3. 随后当一个队列为空时,另一个队列的阵营胜利

代码(CPP)

思路一实现

#include <string>
#include <vector>using namespace std;class Solution {public:string predictPartyVictory(string senate) {int len = senate.length();vector<int> active(len, 1);while (true) {for (int i = 0; i < len; i++) {if (active[i] == 0) {continue;}int j = 1;for (; j <= len; j++) {int idx = i + j;if (idx >= len) {idx -= len;}if (active[idx] == 0) {continue;}if (idx == i) {if (senate[i] == 'D') {return "Dire";}else {return "Radiant";}}if (active[idx] == 1 && senate[idx] != senate[i]) {active[idx] = 0;break;}}}}}
};int main() {string s = "RDD";Solution* S = new Solution();string res = S->predictPartyVictory(s);
}

思路二实现

#include <string>using namespace std;class Solution {public:string predictPartyVictory(string senate) {while (true) {int i = 0;bool flag = false;while (i < senate.length()) {int j = 1;while (j <= senate.length()) {int idx = i + j;if (idx >= senate.length()) {idx -= senate.length();flag = true;}if (idx == i) {if (senate[i] == 'D') {return "Dire";}else {return "Radiant";}}if (senate[idx] != senate[i]) {senate.erase(idx, 1);break;}j += 1;}if (!flag) {i += 1;}}}}
};int main() {string s = "RDR";Solution* S = new Solution();string res = S->predictPartyVictory(s);
}

思路三实现

#include <string>
#include <queue>using namespace std;class Solution {public:string predictPartyVictory(string senate) {int len = senate.length();queue<int> dire;queue<int> radiant;for (int i = 0; i < len; i++) {if (senate[i] == 'D') {dire.push(i);}else {radiant.push(i);}}while (true){if (dire.empty()) {return "Radiant";}if (radiant.empty()) {return "Dire";}if (dire.front() < radiant.front()) {dire.push(dire.front() + len);dire.pop();radiant.pop();}else {radiant.push(radiant.front() + len);radiant.pop();dire.pop();}}}
};int main() {string s = "RDR";Solution* S = new Solution();string res = S->predictPartyVictory(s);
}

LeetCode每日一题——12.11Dota2 参议院相关推荐

  1. Leetcode 每日一题——649. Dota2 参议院

    649. Dota2 参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏里的改变作出决 ...

  2. LeetCode每日一题--649. Dota2 参议院(贪心 队列)

    题目:跳转至 649. Dota2 参议院 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成.现在参议院希望对一个 Dota2 游戏 ...

  3. leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过

    本文目录 leetcode每日一题1609. 奇偶树 圣诞节你做奇偶数了没 BFS套模板一遍过~ 写在前面 题目 示例 提示 思路 代码实现 执行结果 写在最后 leetcode每日一题1609. 奇 ...

  4. Leetcode每日一题——思路小记

    文章目录 LeetCode每日一题 golang T15 2020.6.12 三数之和,双指针的运用 T70 2020.6.13 斐波那契数列 T1014 2020.6.17 最佳观光:双指针,计算公 ...

  5. LeetCode每日一题(题1028)

    题1028 前言 题目 思路 代码 错误 后记 前言 最近在刷LeetCode每日一题,每次做完之后总能有些收获,所以想着不如每天写个博客记录一下做的题目的解法以及自己写的时候问题出在哪里. 题目 从 ...

  6. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  7. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  8. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  9. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用

    leetcode每日一题 539. 最小时间差 示例 1: 输入:timePoints = ["23:59","00:00"] 输出:1 示例 2: 输入:ti ...

最新文章

  1. movavi video suite2020中文版
  2. python中库是什么意思_python的库是什么意思
  3. C# 读取Excel CSV 类型文件到DataSet中,反之从DataSet写入excel
  4. 2017.3.18 糖果 思考记录
  5. html带提示的行号编辑框,文本框中显示行号[兼容IE/FF浏览器}
  6. Nginx 静态文件服务器搭建及autoindex模块解析
  7. php 网络图片 execl,phpexcel图片获取
  8. 各种内部排序算法,C#实现
  9. 堆(基本介绍,代码实现,以及例题)
  10. iptables 端口转发--内网实现上网
  11. java中将json字符串转换成map_Java中Json转Map方法
  12. 中小企业网络安全建设指引
  13. 剩余电流动作继电器在浴室中的应用
  14. 专访阿里云 RocketMQ 团队:现代微服务架构需要新的消息系统
  15. UVALive - 2911 Maximum
  16. python趣味编程与精彩实例-python趣味编程100例(99个)
  17. 经纬恒润荣获海克斯康“最佳业绩奖”
  18. python运动学仿真的意义_运动学仿真实验报告
  19. StoneDB完成华为鲲鹏国产处理器适配认证!
  20. java 迭代器的hasnext,在Python迭代器中具有hasNext?

热门文章

  1. 基于IndRNN的微博短文本情感分析设计与实现
  2. Android完美支持MathML显示公式方程
  3. EXCEL工作表保护密码忘记了,如何撤消工作表保护?
  4. 断了线的风筝,只能让它飞,放过它
  5. python制作图片编辑器_Tkinter制作简单的python编辑器
  6. win10、win11禁用windows defender服务工具Defender Control下载。Antimalware Service Executable占用CPU高的问题解决
  7. 新概念英语(第二册)复习(原文及全文翻译)——Lesson 41 - Lesson 50
  8. 如何自己组装台式电脑?
  9. 模拟购物车页面全选单选的金额累加
  10. 面向对象:叶子的离开是风的追求还是树的不挽留?我若是飘离的叶子,你是否是温润我的春泥?