Python解题 - CSDN周赛第21期 - 接雨水

news2024/11/27 0:37:06

本期比赛都是比较基础的排序、查找,没有多少难度。不过有很多人反映第二题测试数据有问题,基本所有选手在本题上都没得分。最近官方每期比赛都会有类似的数据问题,虽然参赛者对数据有疑问,但从未得到解答,官方也未曾公开数据,而且现在一周双赛,好像所有工作人员都在忙着组织比赛,却没有人根据选手反馈的bug进行解答与修复,给人一种很敷衍、但又着急向上面交差的感觉,希望以后能慢慢改进吧。


第一题:合并序列

有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。

示例:

示例
输入

5

oi

od

ki

ko

ka

k

输出

ka

ki

ko

分析

简单的第一题,用python直接判断字符串的前缀是否和给定的 T 相同,然后把结果排序输出即可,因为字符串列表进行排序时默认使用的就是字典序。

参考代码

N = int(input().strip())
arr = [input().strip() for _ in range(N)]
T = input().strip()
result = sorted(i for i in arr if i.startswith(T))
print(*result,sep="\n")

第二题:千问万问

给定大小为 n 的整数序列A。现在会有 q 次询问,询问子区间的整数数量。

分析

本期bug题,按照题目给的思路无法通过测试用例。原题下面还有一段文字描述,记不清了,大致意思就是说这个整数序列是无序的,而且可能存在重复的整数。每次询问会给出左、右边界(l 和 r),要求输出该整数序列中位于左右边界内的整数个数。

从示例来看给出的边界是闭区间,也就是要输出整数序列A中满足 l\leq a\leq r 的整数a的数量。

所以,题目理解下来应该不难。但是,用尽所有办法,穷举、遍历、二分,都无法通过哪怕一个用例(示例都能够正常通过),这就不禁让人怀疑题目测试用例是否有问题了。(更新:官方已经承认数据是有问题的)

给一个比较简单的穷举代码吧,进一步解释权留给官方。

参考代码

n, q = map(int, input().strip().split())
nums = list(map(int, input().strip().split()))
for _ in range(q):
    l, r = map(int, input().strip().split())
    res = 0
    for i in nums:
        if l <= i <= r:
            res += 1
    print(res)

第三题:连续子数组的最大和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和 。

分析

连续子数组的最大和,也是经典的基础问题了,而且类似的问题曾在第九期考过,代码都不用改。

时间复杂度为 O(n) 的算法的核心思想是:对序列中每一个整数而言,如果之前的序列之和是负数,就不相加。因为如果加上之前的序列,反而比自己本身的值还要小,而我们要找的是最大值,显然不符合,所以这样的话最大子序列就应该从自己开始算起。

所以,额外定义两个变量,一个用来记录连续相加的子序列之和,一个用来记录最大的子序列之和。使用 max() 函数即可完成比较。当for循环遍历完一遍列表,即可得到结果。

参考代码

n = int(input().strip())
arr = list(map(int, input().strip().split()))
result = temp = arr[0]
for i in arr[1:]:
    temp = max(i, i+temp)
    result = max(result, temp)
print(result)

第四题:降水量

给定n个柱面的高度,表示降雨某地n块区域的海拔高度。 计算降雨之后该地最大储水面积。如果低于地平线,也就是小于 0,则一定积水。

示例:

示例一示例二
输入

7

3 4 0 -1 5 2 3

3

-2 -1 -2

输出

10

5

分析

本期稍微有点意思的题目,以前在每日一练也出现过。第一个示例记不清了,我自己编的,但原理都是一样的。

本题类似力扣原题接雨水,所以本期的标题也用了这个名字。题目大意就是说降水后,由于地表高度不同,造成积水,然后问积水的体积——注意,虽然题目里说是面积,但其实参考示例就会发现这里其实是指体积,也许因为只有一个维度,高度,所以体积也变成面积了。

以示例一为例,地形大概就是如下所示:

很显然,降水后,两边的水会流失,最后留下的积水如下图(蓝色)所示:

然后我们数一下积水的体积(面积,或格子数量),就可以得到蓝色部分的格子数量是10,也就是最后的答案。

解题的关键在于如何找到这些能够储水的“水坑”,然后将它们的体积加在一起。力扣上也提供了很多题解,问哥这里使用的是模拟的方法(好像没找到和我类似的思路?),模拟“降水”,然后减去左右两边流走的降水,剩下的就是积水了。

具体做法是,先用“降水”填满整个区域数组,也就是找出原数组的最大值 M(本例中是5),然后以最大值为参照对其它元素“取反”,得到“降水”的数组,然后将该数组进行加总,得到总的降水量 S。

然后从左右两边,依次向中间最高值(降水为0的参照位置)的地方遍历,每遍历一个元素就减去当前“降水”的最小体积,代表流走的降水(下图中灰色的部分),剩下的就是积水的体积了(蓝色部分)。

从图中也可以很容易发现,灰色部分“流走的降水”是两个单调的非递增数组(从左右两边向中间),而这(两)个数组的值是每次遍历降水体积与之前流水相比的较小值(比如从左边遍历到第三个位置,降水是5,但是之前最小的流水是1,所以这个位置也“流走”1单位的降水,从右边遍历到右边第二个位置的时候,这个位置的降水是3,与之前最小的流水2相比,也“流走”2单位的降水)。于是,我们增加一个变量 H,用于保存遍历降水体积时的最小流水体积,每遍历一个位置的降水,就用总降水量 S 减去 H,最终的结果就是剩下的积水体积了。(其实很多类似关于数组的问题都可以这样换个角度解决)

从左右两边向中间参照位置(降水为0)进行两次遍历,总的时间复杂度加在一起还是 O(n),但是这里还要考虑到有三种特殊的情况:

1、有两个以上参照位置。其实这种情况下,思路不用做任何改变,整体所用的时间要更短,因为如果存在两个以上参照位置,说明这两个位置的海拔高度相同,那它们之间的地形无论什么样,降水都会变成积水,所以如果从左右向中间遍历的话,遍历到各自最近的参照位置(0)就可以停止遍历了。如下图所示:

2、左右两边存在水坑(海拔高度为负数,低于地平线)。这种情况下,左右两边的降水并不是全部流走了,水坑里的积水也要统计进去。所以回到我们上面的思路中,用于保存最小流水体积的变量 H 的初始值,应该不大于参照位置的体积 M,比如下图中左右两边最大的降水是6,但是流走的降水体积是5,也就是参照位置的体积。所以在遍历开始时,需要加一个判断,H 的初始值最大不超过 M 。

3、只有水坑,不存在大于0的参照位置,比如示例二。这种情况其实是最简单的,只要把水坑的体积加在一起即可。这样的话需要特判,先要检查区域中是否所有的海拔位置都小于等于0,然后直接返回所有海拔的绝对值的和。但是为了代码的一致性,问哥把这种特判也合并在了上面的思路里。其实只要在一开始选取参照位置的时候,参照位置不小于0即可。只不过这样会需要遍历两遍降水数组(左右向另一边各一遍),然后减去0,最后的答案依然还是总的降水量。由于我们计算时间复杂度的时候只考虑最高项的幂,所以时间复杂度依然还是 O(n),当然,如果对这种情况加入特判的话会更快一些,但代码将会更加冗长。

上述思路的参考实现代码如下:

参考代码

n = int(input().strip())
arr = list(map(int, input().strip().split()))
M = max(0, max(arr))
res = [M-i for i in arr]
S = sum(res)
H = min(M, res[0])
for i in range(n):
    if res[i] == 0: break
    H = min(H, res[i])
    S -= H
H = min(M, res[-1])
for i in range(n-1,-1,-1):
    if res[i] == 0: break
    H = min(H, res[i])
    S -= H
print(S)

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

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

相关文章

十年云深时:天翼云的成长密钥

工业时代&#xff0c;我们通常以“用电量”作为指标&#xff0c;来衡量一个地方的经济发展水平。数字经济时代&#xff0c;“用云量”则与数字经济规模呈正相关。因此&#xff0c;中国数字化浪潮的持续推进&#xff0c;也让云计算行业的重要性与市场竞争性不断提升&#xff0c;…

【C语言】交换奇偶位和 offsetof 宏的实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《阿亮爱刷题》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;交换奇偶…

2021年 APP个人信息使用态势分析报告

声明 本文是学习2021年APP个人信息使用态势分析报告. 下载地址 http://github5.com/view/55008而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 App违规行为处罚案例 某赚钱类App未明示信息收集规则被罚 经查公安机关调查&#xff0c;某网络科技公司开…

2023 CPA 会计-存货【刷题】

1. 存货的确认和初始计量 大元公司为增值税一般纳税人&#xff0c;增值税税率为13%。 这句话好像没有用 2019年购入材料300公斤&#xff0c;收到增值税发票注明价款1800万元&#xff0c;增值税税额是234万元。 增值税是在价款的基础上收取的&#xff0c;所以这批材料的价值就是…

【收集】缩写合集

AABB 全称&#xff1a;Axis Aligned Bounding Box参考 https://blog.csdn.net/qq_22822335/article/details/50930437AABB包围盒在游戏中&#xff0c;为了简化物体之间的碰撞检测运算&#xff0c;通常会对物体创建一个规则的几何外形将其包围。其中&#xff0c;AABB&#xff08…

【链表】关于链表,你该了解这些!

【链表】理论基础1 链表是什么1.1 单链表1.2 双链表1.3 循环链表2 链表的存储方式3 链表的定义3.1 C/C方式3.2 Java方式3.3 JavaScript方式4 链表的操作4.1 删除结点4.2 添加结点1 链表是什么 1.1 单链表 单链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两…

谷粒学苑项目-第一章数据库设计与项目结构

一、数据库设计 1、数据库 guli2、数据表 CREATE TABLE edu_teacher (id char(19) NOT NULL COMMENT 讲师ID,name varchar(20) NOT NULL COMMENT 讲师姓名,intro varchar(500) NOT NULL DEFAULT COMMENT 讲师简介,career varchar(500) DEFAULT NULL COMMENT 讲师资历,一句话说…

6个实用的红米手机技巧

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

盐湖提锂纳滤膜后钙镁离子深度处理技术

盐湖提锂&#xff1a;大规模、低成本&#xff0c;全球锂资源供应主体的理想来源锂作为自然界中轻、标准电极电势低、电化学当量大的金属元素&#xff0c;是天生理想的“电池金属”&#xff0c;因此在要求高比能的动力和储能应用场景中将具备长期的需求刚性&#xff0c;被誉为“…

Skywalking简单入门使用

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Skywalking简单入门使用 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;50分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林…

软件测试/测试开发丨 | 想做App测试就一定要了解的App结构

性能测试 所谓的性能测试要在功能测试之后。 功能测试&#xff1a;关注能不能用 性能测试&#xff1a;关注好不好用 常见的性能关注点有&#xff1a; 接口响应时间&#xff1a;50毫秒 ~ 1000毫秒 吞吐量&#xff1a;1000万每天&#xff0c;2000万每天 ......10亿每天 TPS&a…

java面试题基本部分

一、Java 基础 1.Java常见基本类型如下 整数类&#xff08;byte、short、int、long&#xff09; 浮点类&#xff08;float、double&#xff09; 字符类&#xff08;char&#xff09; 布尔型&#xff08;boolean&#xff09;大小&#xff1a; boolean(8位 1字节) byte(8位 1字…

【数据结构与算法】Manacher算法

Manacher算法 https://github.com/SongJianHIT/DataStructurs-Algorithm/tree/main/src/algorithms/manacher 基本介绍 Manacher 算法常用于 求一个字符串中的最长回文子串。如&#xff1a;abc123321def 的最长回文子串为 123321。 计算字符串的最长回文字串最简单的算法就是…

Lattice CrossLink-Nx LIFCL-40应用连载8:MIPI DSI接口驱动LCD显示器

作者&#xff1a;Hello&#xff0c;Panda 一、案例需求 使用LIFCL-40-7MG121I FPGA的MIPI DSI硬核接口驱动7寸LCD显示器&#xff1a; &#xff08;1&#xff09;显示器&#xff1a;7寸&#xff0c;1024*600横屏&#xff0c;60Hz&#xff1b; &#xff08;2&#xff09;MIPI物…

计算机网络实验---Cisco Packet Tracer 实验

直接连接两台 PC 构建 LAN 用交换机构建 LAN 交换机接口地址列表 生成树协议&#xff08;Spanning Tree Protocol&#xff09; 路由器配置初步 静态路由 动态路由 RIP 动态路由 OSPF 基于端口的网络地址翻译 PAT 虚拟局域网 VLAN 虚拟局域网管理 VTP VLAN 间的通信 …

功率放大器电路图集(多种类功率放大电路)

关于功率放大器电路图集的问题是很多工程师都感兴趣和想了解的&#xff0c;今天就请安泰电子来为大家介绍一下多种类功率放大电路的内容。 一、功率放大电路介绍 1、一般情况来说功率放大电路的主要作用是让负载在不使信号失真或轻微失真的情况下获得最大功率。因此&#xff0c…

JavaScript 语法

文章目录JavaScript 语法JavaScript 语法JavaScript 字面量JavaScript 变量JavaScript 操作符JavaScript 语句JavaScript 关键字JavaScript 注释JavaScript 数据类型数据类型的概念JavaScript 函数JavaScript 字母大小写JavaScript 字符集JavaScript 语法 JavaScript 是一个程序…

Docker - Docker Compose;Docker Swarm

一、Docker Compose &#xff08;一&#xff09;Docker Compose介绍 Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose&#xff0c;您可以使用YML文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从YML文件配置中创…

可视化组件使用小技巧——中国地图组件的应用

中国地图作为我们数据展示常用的组件&#xff0c;通常被我们用来展示与地理位置相关的数据&#xff0c;中国地图组件在实际应用中可以帮助我们充当地区数据展示的作用&#xff0c;并让我们一眼看出区域之前的差异趋势。接下来结合实际案例让我们看看在山海鲸可视化软件中如何具…

你知道几种乘法的计算方式?

前言 家里有本《算法详解》一直没有看&#xff0c;昨天晚上打开翻了翻&#xff0c;觉得写的挺有趣的&#xff0c;第一章讨论了一个大家都学过的内容&#xff0c;乘法的计算。大部分人计算乘法&#xff0c;应该都只有一种方式&#xff0c;乘法的计算&#xff0c;也算是一种算法…