Python算法练习 10.12

leetcode 649 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 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利。
因此在第二轮只剩下第三个参议员拥有投票的权利,于是他可以宣布胜利

 我的思路:

设置一个对应状态数组,有效为1,禁用为2

“最好的策略”就是每次轮到谁投票,如果敌对阵营还有有效投票的参议员,那就禁用,如果没有,就宣布胜利

class Solution(object):def predictPartyVictory(self, senate):""":type senate: str:rtype: str"""state = [1] * len(senate)  # 每个参议员的状态 1正常 2被禁用def circle():  # 一轮投票过程count = 0while count < len(senate):if state[count] != 2:if senate[count] == 'R':j = 0while j < len(senate) :if senate[j] == 'D' and state[j] == 1:state[j] = 2breakj += 1if senate[count] == 'D':j = 0while j < len(senate):if senate[j] == 'R' and state[j] == 1:state[j] = 2breakj += 1# print(count, state)count += 1while 1:circle()first = ''end = ''count1, count2 = 0, 0while count1 < len(senate):if state[count1] != 2:first = senate[count1]breakcount1 += 1while count2 < len(senate):if state[count2] != 2:end = senate[count2]if first != end and end:breakcount2 += 1# print(state, first, end)# print(state)if first == end:if first == 'D':return "Dire"else:return "Radiant"

呜呜,没想到思路错了:

 看了题解,原来不是从头开始选择敌对阵营的参议员,而是选择【最早有机会投票】的敌对阵营参议员,也就是接下来离我最近的敌对阵营参议员,如果挑选了其他较晚投票的议员,那么等到最早可以进行投票的那一名议员行使权利时,一名天辉方议员就会丧失权利,这样就得不偿失了。

修改之后思路正确但超时:

class Solution(object):def predictPartyVictory(self, senate):state = [1] * len(senate)  # 每个参议员的状态 1正常 2被禁用# queue = deque()def circle():  # 一轮投票过程count = 0while count < len(senate):if state[count] != 2:if senate[count] == 'R':j = countflag = 1while j < len(senate) :if senate[j] == 'D' and state[j] == 1:state[j] = 2flag = 2 # 已经投过票了breakj += 1if flag == 1:j = 0# 检查我前面的敌对参议员while j < count:if senate[j] == 'D' and state[j] == 1:state[j] = 2flag = 2breakj += 1if senate[count] == 'D':j = countflag = 1while j < len(senate):if senate[j] == 'R' and state[j] == 1:state[j] = 2flag = 2  # 已经投过票了breakj += 1if flag == 1:j = 0# 检查我前面的敌对参议员while j < count:if senate[j] == 'R' and state[j] == 1:state[j] = 2flag = 2breakj += 1# print(count, state)count += 1while 1:circle()first = ''end = ''count1, count2 = 0, 0while count1 < len(senate):if state[count1] != 2:first = senate[count1]breakcount1 += 1while count2 < len(senate):if state[count2] != 2:end = senate[count2]if first != end and end:breakcount2 += 1# print(state, first, end)# print(state)if first == end:if first == 'D':return "Dire"else:return "Radiant"

 来看官方题解:

设置两个队列,存储R和D在原始数组中的索引(也就是发言顺序)

两个敌对阵营中,在队头的元素,发言早的禁用发言晚的

发言早的进入队尾,等待下一次发言

发言晚的直接出队

最后哪个队不空就是哪个队赢

class Solution(object):def predictPartyVictory(self, senate):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]:radiant.append(radiant[0] + n)else:dire.append(dire[0] + n)radiant.popleft()dire.popleft()return "Radiant" if radiant else "Dire"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌动智能:UI自动化测试工具几点优势

UI自动化测试工具在现代软件开发中扮演着重要的角色&#xff0c;它们能够有效地验证应用程序的用户界面&#xff0c;确保其在不同平台和设备上的正常运行。本文将介绍掌动智能UI自动化测试工具的优势有哪些! 掌动智能UI自动化测试工具优势 1、零成本入门 自然语言编写&#xff…

2023年中国划船机产量、销量及市场规模分析[图]

划船机是一种健身器材&#xff0c;它模拟了划船的运动&#xff0c;可以锻炼身体的肌肉力量和协调性。划船机通常由座椅、把手、脚踏板和传动装置组成&#xff0c;使用者可以通过拉动把手来模拟划船的动作&#xff0c;从而达到锻炼身体的目的。 划船机产业链 资料来源&#xff…

聊聊分布式架构05——[NIO基础]BIO到NIO的演进

目录 I/O I/O模型 BIO示例 BIO与NIO比较 NIO的三大核心 NIO核心之缓冲区 Buffer常用子类&#xff1a; Buffer常用API Buffer中的重要概念 NIO核心之通道 FileChannel 类 FileChannel常用方法 NIO核心之选择器 概述 应用 NIO非阻塞原理分析 服务端流程 客户端…

ESP32-S3上手开发

1、搭建开发环境 首先搭建开发环境&#xff0c;这里采用了windows下集成开发环境ide进行开发&#xff0c;具体的安装方法&#xff1a;ESP-IDF安装配置 这里使用的乐鑫的esp32s3&#xff0c;N16R8 2、esp32s3模块 从上面图中可以看到&#xff0c;N16R8这里使用了外扩16M的fl…

将网站域名访问从http升级到https(腾讯云/阿里云)

文章目录 1.前提说明2.服务器安装 docker 与 nginx2.1 安装 docker&#x1f340; 基于 centos 的安装&#x1f340; 基于ubuntu 2.2 配置阿里云国内加速器&#x1f340; 找到相应页面&#x1f340; 创建 docker 目录&#x1f340; 创建 daemon.json 文件&#x1f340; 重新加载…

基于工业5G网关的工业机器人监测控制方案

随着智能制造、自动化生产的发展进步&#xff0c;工业机器人的身影越来越多地出现在工厂现场&#xff0c;成为新型无人化、智能化生产制造的中坚力量。 工业机器人的运行伴生着海量的数据采集、传输、分析和反馈执行&#xff0c;因此也需要高速、低延迟的5G网络&#xff0c;支撑…

基于SpringBoot的健身房管理系统

目录 前言 一、技术栈 二、系统功能介绍 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步…

PowerManagerServcie

PowerManagerServcie&#xff08;PMS&#xff09; 1. 电源管理架构2.电源管理4个层次3.电源管理服务 - PowerManagerService 1. 电源管理架构 PowerManagerService是android系统电源管理的核心服务。 PowerManagerService继承自SystemService,在SystemServer的main()方法中&am…

Python 单元测试设置

单元测试检查特定代码单元或模块是否按照开发人员的预期执行。 大多数时候&#xff0c;我们测试的代码单元是一个函数。 同样&#xff0c;我们可以测试所有功能。 作为最佳实践&#xff0c;至少在开发过程中&#xff0c;我们应该进行单元测试。 因此&#xff0c;在开发过程的…

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务&#xff0c;安装微软官方示例一切都挺顺利&#xff0c;代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题&#xff0c;而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…

读书笔记-《ON JAVA 中文版》-摘要26[第二十三章 注解]

文章目录 第二十三章 注解1. 基本语法1.1 基本语法1.2 定义注解1.3 元注解 2. 编写注解处理器2.1 编写注解处理器2.2 注解元素2.3 默认值限制 3. 使用javac处理注解4. 基于注解的单元测试5. 本章小结 第二十三章 注解 注解&#xff08;也被称为元数据&#xff09;为我们在代码…

Web应用-Thinkphp框架-开发指南

Thinkphp框架 二级导航分类&#xff0c;模板继承&#xff0c;内置标签Public 修改MVC模块化 ——访问机制传参加载模版模版引入 分离Runtime 缓存文件管理员添加数据验证及验证场景 控制器 validate 在sql执行&#xff08;敏感操作&#xff09;之前验证数据模板 分页数据表连接…