题目

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:
参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。
宣布胜利:
如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dota2-senate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

假设当前行使权力的为天辉方议员:
如果目前仍然有夜魇方的议员,那么这名天辉方的议员只能行使「禁止一名参议员的权利」这一项权利。显然,该议员不会令一名同为天辉方的议员丧失权利,所以他一定会挑选一名夜魇方的议员。
应该贪心地挑选按照投票顺序的下一名夜魇方的议员。这也是很容易形象化地证明的:既然只能挑选一名夜魇方的议员,那么就应该挑最早可以进行投票的那一名议员;反之,如果挑选了其它较晚投票的议员,那么等到最早可以进行投票的那一名议员行使权利时,一名天辉方议员就会丧失权利,这样就得不偿失了。
举个形象化例子:
对于RDRDD:

第一轮:
第1个R选择最远的D:
RDRDd
第一个D选择最近的R:
RDrDd
第二个D选择唯一的R:
rDrDd
此时夜魇获胜

而如果选择最近的敌方:

第一轮:
RdRDD
RdRdD
rdRdD
第二轮:
rdRdd
此时天辉方获胜

维护两个队列dire和radiant:
由于我们总要挑选投票顺序最早的议员,因此我们可以使用两个队列 radiantdire分别按照投票顺序存储天辉方和夜魇方每一名议员的投票时间。
n 是给定的字符串senate 的长度。
随后我们就可以开始模拟整个投票的过程:
如此时 radiant或者 dire为空,那么就可以宣布另一方获得胜利。

如果均不为空,那么比较这两个队列的首元素,就可以确定当前行使权利的是哪一名议员。如果 radiant 的首元素较小,那说明轮到天辉方的议员行使权利,其会挑选 dire 的首元素对应的那一名议员。因此,我们会将dire的首元素永久地弹出,并将radiant的首元素弹出,增加 n 之后再重新放回队列,表示参加下一轮。

代码实现

import collections
class Solution:def predictPartyVictory(self, senate:str)-> str:n = len(senate)radiant = collections.deque()dire = collections.deque()for i,ch in enumerate(senate):if ch == 'R':radiant.append(i)else:dire.append(i)while radiant and dire:if radiant[0] < dire[0]:dire.popleft()num  =  radiant.popleft() + nradiant.append(num)else:radiant.popleft()num = dire.popleft() + ndire.append(num)if dire:return "Dire"else:return "Radiant"
ans = Solution()
senate = str(input())
print(ans.predictPartyVictory(senate))

LeetCode每日一题(Python实现)649.Dota2参议院相关推荐

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

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

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

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

  3. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

  4. LeetCode 649. Dota2 参议院 | Python

    649. Dota2 参议院 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/dota2-senate/ 题目 Dota2 的世界里有两个阵营:Ra ...

  5. leetcode每日一题·买卖股票问题(Python)

    leetcode每日一题·买卖股票问题(Python) 买卖股票的最佳时机(股票最大利润) 题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的 ...

  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 ...

  10. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

最新文章

  1. xml命名空间只是标记区分不同的空间的作用,一般与上网无关,虽然通常都写的是URL网址
  2. java nodelist 快速排序,【Leetcode】Sort List in java,你绝对想不到我是怎么做的^^我写完过了我自己都觉得好jian~...
  3. MySQL备份原理详解
  4. 哎呀你不要把他叫出来_不吼不叫,学会这3个亲子互动方法,孩子不专注都难...
  5. 大数据之-Hadoop3.x_MapReduce_开发总结---大数据之hadoop3.x工作笔记0137
  6. 5、SQL Server数据库、T-SQL
  7. .Net IOC框架入门之二 CastleWindsor
  8. 数据分析师自学好还是报班好
  9. wke升级vs2010,vs2013
  10. 站在HR角度之五:(群面)无领导小组面试的种种——附500强经典案例
  11. 中国天气预报网接口及城市代码
  12. utf-8 汉字对照表
  13. shell编程三大神器之sed
  14. Google guava之SortedMultiset简介说明
  15. 怎么画动漫人物的五官:耳鼻眼嘴
  16. 简单的LED交替闪烁程序
  17. 宏碁暗影骑士3 win10 和 ubuntu18.04双系统安装
  18. 如何使用 dlv 结合 Goland 进行程序 debug 调试
  19. [论文评析]基于人体姿态识别的立定跳远 动作智能评估系统
  20. npm install命令运行中出现Error: ENOENT: no such file or directory解决方法

热门文章

  1. rtmp over quic直播服务--mediago
  2. PHP游戏人物解锁,火影忍者疾风传究极忍者风暴革命人物解锁方法介绍
  3. python年月日时分秒
  4. 冒号 : 与双冒号 :: 的C++用法
  5. #65-【Tarjan】上白泽慧音
  6. 图解DFT,DTFT,DFS,FFT,FT,FS区别与联系
  7. 首师大附中集训第二十天综合模测
  8. 全球图片博客五佳简介
  9. 微信分享:后端参数获取PHP实现
  10. 黑科技:自定义百度云分享密码