Python解题 - CSDN周赛第33期

news2024/11/15 11:13:34

本期四道题全考过,题解在网上也都搜得到。。。没有想法,顺手水一份题解吧。


第一题:奇偶排序

给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

输入描述:第一行输入整数n。(1<=n<=1000)表示数组大小;第二行输入n个整数a.(1<=n<=100)

输出描述:输出重排之后的数组。

示例:

示例
输入6
3 34 67 89 90 58
输出3 67 89 34 90 58

分析

超级大水题,直接遍历一遍数组,把奇数和偶数分开成两个数组,最后再把两个数组返回即可,时间复杂度 O(n) 。

如果想加点花,比如降低空间复杂度(上面需要借助外部空间存储奇数和偶数数组),可以在原数组遍历,如果遇到奇数,就和它前面的数交换位置,直到前面为空或不是偶数位置。类似冒泡排序,时间复杂度 (On^2),很没必要。

本题因为要求奇数间和偶数间的相对位置不变,所以不能使用不稳定的排序方法比如快排。

参考代码

n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
odd = list()
even = list()
for i in arr:
    if i%2: odd.append(i)
    else: even.append(i)
print(*odd, *even)

第二题:小艺改编字符串

已知字符串str。添加至少多少字符可以使得str变成回文串。

输入描述:输入字符串s.(1<=len(str)<=100000)

输出描述:输出最小需要添加字符的数量。
示例:

示例
输入abab
输出

1

分析

很久以前考过,不过还是值得一说。思路还是动态规划,好像递归也可以?没有试过。

问哥觉得关于字符串的动态规划常常有点抽象,不太好理解,所以保险起见,我们还是画图来看。

首先,对于任意一个长度大于 1 的字符串(长度等于 1 的字符串本身就是回文串,不需要添加字符),如果我们观察它的左右两端,只有下面两种可能:

  1. 最左端和最右端的字符相同;
  2. 最左端和最右端的字符不同。

我们可以用 i 和 j 表示左右两端字符串的下标,用 S_{i,j} 表示从下标 ij 的字符串,如下图所示:

然后,对于左右端字符相同的字符串,我们可以把它们剥掉,得到一个新的子串 S_{i+1, j-1},很显然,只要子串 S_{i+1,j-1} 是回文串,那么原来的 S_{i,j} 必定也是回文串。所以原问题就转变成一个子问题:需要添加多少字符可以使得子串 S_{i+1,j-1} 变成回文串?

而对于左右端字符不同的字符串,我们有两种选择:

  1. 如果子串 S_{i,j-1} 是回文串,我们可以在左边添加一个和最右端相同的字符,使原字符串 S_{i,j} 变成回文串;
  2. 如果子串 S_{i+1,j} 是回文串,则我们也可以在右边添加一个和最左端相同的字符,使原字符串 S_{i,j} 变成回文串。

那么,只要在这两种选择中取较小的作为答案即可。

于是,动态转移过程就很清楚了。我们定义一个二维数组 dp[i][j] 表示需要添加多少字符使得字符串 S_{i,j} 变成回文串,则可得状态转移方程如下(S_i 和 S_j 分别表示字符串 S_{i,j} 左右两端的字符):

  • 如果 S_i = S_j ,则 dp[i][j] = dp[i+1][j-1]
  • 如果 S_i \neq S_j ,则 dp[i][j] = min(dp[i][j-1], dp[i+1][j])+1

先给个递归的写法,就是直接把上面的转移公式套进来。

参考代码一

def fun(s):
    n = len(s)
    if n <= 1: return 0
    i, j = 0, n-1
    if s[i] == s[j]: return fun(s[i+1:j])
    return min(fun(s[i:j]), fun(s[i+1:j+1]))+1
s = input().strip()
print(fun(s))

但是因为字符串长度达到1e5,递归极有可能超时。

但是递归给我们的顺序值得参考:所有递归到最终的字符串长度必定为 1 或 0 (空字符串)。

所以,如果我们使用动态规划,原字符串的答案,必须按子字符串的长度,从小到大,递推过来。也就是说,我们必须先得到所有长度为 1 或 0 的子串的答案,再递推到长度为 2 的,然后是长度为 3 的。。。直到长度等于原字符串。

所以我们在传统的 (i,j) 双循环中必须加一个变量 k,用来表示子字符串的长度。而一旦 k 的长度确定了,j = i + k,所以还是双循环。循环次数也很好计算,就是所有子串数量之和:\frac{n*(n+1)}{2}

时间复杂度是 O(n^2) ,但是因为除以 2,所以计算量级还是 1e9,勉强可以接受。

参考代码二

s = input().strip()
n = len(s)
dp = [[0]*n for _ in range(n)]
for k in range(1, n):
    for i in range(n - k):
        j = i + k
        if s[i] == s[j]: dp[i][j] = dp[i+1][j-1]
        else: dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1
print(dp[0][n-1])

第三题:公司新表

公司里为了凸显公司的特性。安装了一个n进制表。已知新的表的时间是”H:M”。时间合法的定义为H<=23 && M<=59。时间有多少种进制定义的方式,依次打印出来。如果有无数种解输出”-1”,不存在输出”0”。

输入描述:输入一行字符串a:b形式。

输出描述:输出答案。

示例:

示例
输入11:20
输出3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

分析

13期考过。

不难,但是因为要分析字符串,既抽象又繁琐,所以本题参考代码不想给了,问哥写得很繁琐,大部分时间浪费在这题,看到就烦 ><。

简单说说思路:先把给定的字符串按冒号一分为二,左边为小时数,右边为分钟数。

先特判,什么样的情况是有无数种解呢?因为字符串中可以含有字母,那么假定字母代表了一个数字,只要不进位(字符串长度为 1),就可以代表无数种解。比如一个字母 A,可以代表11进制以上的所有进制,因为 A 就代表了10(按照顺序),是合法的小时(小于24)或分钟(小于60)数。同样,很显然,如果代表小时的一个字母表示了24以上的十进制数字,或代表分钟的一个字母表示60以上的十进制数字,则必定是没有解,返回 0。

而如果进了一位,答案必定有限,比如 11,最多只能代表22进制(该进制中11代表十进制的23)。所以,只要检查分割后的代表小时和分钟的字符串的长度,小于等于1且代表十进制数字小于24或小于60,就必定是无数种解,直接返回-1。

然后就是穷举了,从小时和分钟数所能代表的最小进制开始,比如字符串AB,不可能代表12进制及以下的进制。然后循环加一,每次计算小时和分钟翻译成十进制是否小于24和小于60。知道不满足此条件为止。

如果一个都没找到,很显然,直接返回 0。否则就把所有答案打印出来即可。


第四题:选择客栈

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。

输入描述:共n+1 行。第一行三个整数 n ,k ,p ,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。

输出描述:一个整数,表示可选的住宿方案的总数。

示例:

示例
输入5 2 3
0 5
1 3
0 2
1 4
1 5
输出3

分析

15期考过。还是动态规划,可以参考我以前的题解,详细记录了思考过程(写得可能有些繁琐),这里不再赘述了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深究Java Hibernate框架下的Deserialization

写在前面 Hibernate是一个开源免费的、基于 ORM 技术的 Java 持久化框架。通俗地说&#xff0c;Hibernate 是一个用来连接和操作数据库的 Java 框架&#xff0c;它最大的优点是使用了 ORM 技术。 Hibernate 支持几乎所有主流的关系型数据库&#xff0c;只要在配置文件中设置好…

在 The Sandbox 中以全新的 Rabbids 体验庆祝兔年!

育碧(Ubisoft) 和 The Sandbox 联手为你们带来终极的农历新年体验&#xff01; 穿戴上你们新鲜出炉的 Rabbids 人物化身来参加派对吧&#xff0c;保证震撼整个元宇宙&#xff01;这个全新体验为 Rabbids 人物化身持有者专属。没有获得 Rabbids 人物化身吗&#xff1f;不要担心&…

【Java】P2 基础语法与运算符

Java 基础语法 运算符Java注释方法基本数据类型驼峰命名法Scanner类基本运算除法隐式转换逻辑运算符 以及 短路逻辑运算符三元运算符前言 上一节内容涵盖Java的基础知识&#xff0c;包含安装下载&#xff0c;JDK与JRE等。 链接&#xff1a;https://blog.csdn.net/weixin_43098…

java 多线程处理任务

首先介绍一下我的使用场景我在redis set集合中有几十万个行程id&#xff0c;我需要一个脚本来离线计算每个行程的里程&#xff0c;计算完了之后&#xff0c;将公里数填到mongodb的表中&#xff0c;并且删除set集合中这个元素。我的目录结构我们创建一个maven项目&#xff0c;然…

STM32之PWM

PWMPWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;&#xff0c;对模拟信号电平进行数字编码&#xff0c;也就是说通过调…

Office 365用户报告

通过ADManager Plus的现成Office 365用户报告&#xff0c;您无需复杂的PowerShell脚本&#xff0c;即可查找Office 365环境中用户的重要信息。使用这些报告&#xff0c;您只需点击几次基于Web的控制台&#xff0c;即可提取Office 365环境中活动和不活动用户数量等信息&#xff…

Celery 分布式任务队列

1. 认识 Celery Celery 是一个 基于 Python 开发的分布式异步消息任务队列&#xff0c;可以实现任务异步处理&#xff0c;制定定时任务等。 异步消息队列&#xff1a;执行异步任务时&#xff0c;会返回一个任务 ID 给你&#xff0c;过一段时间后拿着任务 ID 去取执行结果定时…

进程的介绍

文章目录一.进程的概念1.1概念1.2进程的组成1.2.1 PCB中描述进程的特征二.进程的虚拟地址空间三.进程间的通信引入线程一.进程的概念 1.1概念 百科的介绍: 换句话说,一个跑起来的程序,就是一个进程,也就是在操作系统中运行的exe程序就是一个进程,如下图的进程列表 进程是操…

【女士,房间墙上凿个洞,看你在干嘛~】安全攻防内网渗透-绕过防火墙和安全检测,搭建DNS隐蔽隧道

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Java并发包提供了哪些并发工具类?

第19讲 | Java并发包提供了哪些并发工具类&#xff1f; 通过前面的学习&#xff0c;我们一起回顾了线程、锁等各种并发编程的基本元素&#xff0c;也逐步涉及了 Java 并发包中的部分内容&#xff0c;相信经过前面的热身&#xff0c;我们能够更快地理解 Java 并发包。 今天我要…

SpringBoot集成Swagger3.0(入门) 02

文章目录Swagger3常用配置注解接口测试API信息配置Swagger3 Docket开关&#xff0c;过滤&#xff0c;分组Swagger3常用配置注解 ApiImplicitParams,ApiImplicitParam&#xff1a;Swagger3对参数的描述。 参数名参数值name参数名value参数的具体意义&#xff0c;作用。required参…

mes系统核心业务流程及应用场景介绍

现在许多企业已经开始使用MES系统控制和管理工厂的生产过程&#xff0c;实时监控、诊断和控制生产过程&#xff0c;完成单元集成和系统优化。本文将为大家具体介绍一下MES系统的业务流程。 MES系统业务流程 1、计划调度MES系统承接了ERP订单&#xff0c;开始干预生产。该模块…

kaggle RSNA 比赛过程总结

引言 算算时间&#xff0c;有差不多两年多没在打kaggle了&#xff0c;自20年最后一场后&#xff08;其实之前也就打过两场&#xff0c;一场打铁&#xff0c;一场表格赛是金是银不太记得&#xff0c;当时相当于刺激战场&#xff0c;过拟合lb大赛太刺激了&#xff0c;各种trick只…

毕业设计 基于51单片机的指纹红外密码电子锁

基于51单片机的指纹红外密码电子锁1、项目简介1.1 系统框架1.2 系统功能2、部分电路设计2.1 STC89C52单片机最小系统电路设计2.2 矩阵按键电路电路设计2.3 液晶显示模块电路设计3、部分代码展示3.1 LCD12864显示字符串3.2 串口初始化实物图1、项目简介 选题指导&#xff0c;项…

动态规划|特殊的多行规划|dp[2][] 用两行元素分别记录状态变化

多行规划是我自己整理此类问题时起的名字&#xff0c;如有专属名词&#xff0c;麻烦评论告知 用于处理当动态规划中&#xff0c;需要记录多个值的状态变化时。 376. 摆动序列&#xff08;特殊的自定义二维dp&#xff09; 做惯了一般的动态规划&#xff0c;突然看到这种题目&a…

UDPTCP网络编程

udp编程接口 一个UDP程序的编写可以分为3步&#xff1a; 创建一个网络套接字&#xff1a; 它相当于文件操作时的文件描述符&#xff0c;是一个程序进行网络通讯的门户&#xff0c; 所有的网络操作都要基于它 绑定IP和端口&#xff1a; 需要为网络套接字填充IP和端口信息 但是…

Python - 操作txt文件

文章目录打开txt文件读取txt文件写入txt文件删除txt文件打开txt文件 open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue)函数用来打开txt文件。 #方法1&#xff0c;这种方式使用后需要关闭文件 f open("data.txt","r&qu…

【Visual Studio】git提交代码时使用GPG

前言 下载安装GPG的过程省略,直接开始进行配置 0.visual studio 版本说明 其余版本未测试,但是应该也是可以的 1 获取GPG的密钥ID 1.1 window下可以打开Kleopatra查看生成好的密钥的密钥ID 1.2 也可以从命令行中获取 gpg --list-keys 红框位置,后16位就是密钥ID 2 配置.git…

QML MouseArea详解

1.MouseArea简介 MouseArea是一个不可见的项目&#xff0c;通常与一个可见的项目一起使用&#xff0c;以便为该项目提供鼠标处理。通过有效地充当代理&#xff0c;鼠标处理的逻辑可以包含在MouseArea项中。 常用属性&#xff1a; 属性 类型描述 containsMouse bool 光标当前…

刷题笔记2 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 […