算法刷题打卡第43天:Dota2 参议院

news/2024/12/15 5:40:00/

Dota2 参议院

难度:中等

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)

Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的 一 项:

  • 禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失 所有的权利
  • 宣布胜利:如果参议员发现有权利投票的参议员都是 同一个阵营的 ,他可以宣布胜利并决定在游戏中的有关变化。

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

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

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

示例 1:

输入:senate = "RD"
输出:"Radiant"
解释:
第 1 轮时,第一个参议员来自 Radiant 阵营,他可以使用第一项权利让第二个参议员失去所有权利。
这一轮中,第二个参议员将会被跳过,因为他的权利被禁止了。
第 2 轮时,第一个参议员可以宣布胜利,因为他是唯一一个有投票权的人。

示例 2:

输入:senate = "RDD"
输出:"Dire"
解释:
第 1 轮时,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利。
这一轮中,第二个来自 Dire 阵营的参议员会将被跳过,因为他的权利被禁止了。
这一轮中,第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利。
因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利

贪心 + 「循环」队列

思路:
我们以天辉方的议员为例。当一名天辉方的议员行使权利时:

  • 如果目前所有的议员都为天辉方,那么该议员可以直接宣布天辉方取得胜利;
  • 如果目前仍然有夜魇方的议员,那么这名天辉方的议员只能行使「禁止一名参议员的权利」这一项权利。显然,该议员不会令一名同为天辉方的议员丧失权利,所以他一定会挑选一名夜魇方的议员。那么应该挑选哪一名议员呢?容易想到的是,应该贪心地挑选按照投票顺序的下一名夜魇方的议员。这也是很容易形象化地证明的:既然只能挑选一名夜魇方的议员,那么就应该挑最早可以进行投票的那一名议员;如果挑选了其他较晚投票的议员,那么等到最早可以进行投票的那一名议员行使权利时,一名天辉方议员就会丧失权利,这样就得不偿失了。

由于我们总要挑选投票顺序最早的议员,因此我们可以使用两个队列 r_quene \textit{r\_quene} r_quene d_quene \textit{d\_quene} d_quene 分别按照投票顺序存储天辉方和夜魇方每一名议员的投票时间。随后我们就可以开始模拟整个投票的过程:

  • 如果此时 r_quene \textit{r\_quene} r_quene 或者 d_quene \textit{d\_quene} d_quene 为空,那么就可以宣布另一方获得胜利;
  • 如果均不为空,那么比较这两个队列的首元素,就可以确定当前行使权利的是哪一名议员。如果 r_quene \textit{r\_quene} r_quene 的首元素较小,那说明轮到天辉方的议员行使权利,其会挑选 d_quene \textit{d\_quene} d_quene 的首元素对应的那一名议员。因此,我们会将 d_quene \textit{d\_quene} d_quene 的首元素永久地弹出,并将 r_quene \textit{r\_quene} r_quene 的首元素弹出,增加 n 之后再重新放回队列,这里 n 是给定的字符串 senate \textit{senate} senate 的长度,即表示该议员会参与下一轮的投票。同理,如果 d_quene \textit{d\_quene} d_quene 的首元素较小,那么会永久弹出 r_quene \textit{r\_quene} r_quene 的首元素,剩余的处理方法也是类似的。

这样一来,我们就模拟了整个投票的过程,也就可以得到最终的答案了

时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 senate \textit{senate} senate 的长度。在模拟整个投票过程的每一步,我们进行的操作的时间复杂度均为 O ( 1 ) O(1) O(1),并且会弹出一名天辉方或夜魇方的议员。由于议员的数量为 n n n,因此模拟的步数不会超过 n n n,时间复杂度即为 O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n),即为两个队列需要使用的空间。

import collections
class Solution:def predictPartyVictory(self, senate: str) -> str:length = len(senate)r_quene, d_quene = collections.deque(), collections.deque()for i, x in enumerate(senate):if x == 'R':r_quene.append(i)else:d_quene.append(i)while r_quene and d_quene:r, d = r_quene.popleft(), d_quene.popleft()if r < d:r_quene.append(r + length)else:d_quene.append(d + length)return "Radiant" if r_quene else "Dire"

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


http://www.ppmy.cn/news/376728.html

相关文章

DOTA2攻速计算公式研究

常见的游戏中都有属于自己的一套伤害机制&#xff0c;最近发现DOTA2中攻速计算公式与明日方舟中的几乎一致&#xff0c;因此在学习之余记录下来。 1.名词概念 在介绍计算公式前&#xff0c;先引入几个基本概念 基础攻击间隔BAT&#xff08;Base Attack Time&#xff09;&…

Dota2 参议院

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

649. Dota2 参议院

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

Aprioi关联算法

国际权威的学术会议IEEE International Conference on Data Mining (ICDM) 评选出了数据挖掘领域的十大经典算法&#xff0c;他们分别是&#xff1a;C4.5、kMeans、SVM、Apriori、EM、PageRank、AdaBoost、KNN、Naive Bayes以及CART。今天就让我们共同探讨一下十大算法之一Apri…

PLC典型控制程序设计/红绿灯控制程序设计/滚筒测速设计/

1. 红绿灯控制程序设计 **实验目的&#xff1a;**红绿灯控制程序设计&#xff1a;通过TIA15.1实现一个十字路口的红绿灯模拟&#xff0c;启动开关时&#xff0c;交通信号灯开始工作&#xff0c;此时东西绿灯亮&#xff0c;南北红灯亮&#xff0c;东西绿灯亮10S后、东西黄灯亮、…

使用VUE实现滚筒式文字轮播

效果图&#xff1a; 1、支持鼠标滚轮滚动事件 2、其他暂不支持 3、支持事件调用&#xff0c;可根据当前展现的数据进行任务调度&#xff0c;比如在滚动到北京市的时候&#xff0c;在下方列表显示北京的所有区县 实现思路&#xff1a; 1、写三个文本标签&#xff0c;一个上次…

vue 实现横向滚筒滚动

标题引入 vue-seamless-scroll 命令行执行&#xff1a;npm install vue-seamless-scroll --save然后在main.js中引用&#xff1a;import scroll from vue-seamless-scrollVue.use(scroll)页面内使用 <template><div class"laboratory"><div class&q…

滚筒包胶冷硫化工艺步骤

1.用铲胶机铲除滚筒表面残留的旧橡胶板&#xff0c;铲除过程中注意不得铲到滚筒金属表面造成金属表面凹凸不平。 2.用纤维打磨碟打磨滚筒&#xff0c;使滚筒露出新的金属表面&#xff0c;清理金属表面的焊缝&#xff0c;保持表面无切口、气孔及空隙&#xff0c;表面不得有锥柱体…