[解题报告] CSDN竞赛第21期
Posted AlgoComp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第21期相关的知识,希望对你有一定的参考价值。
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/35
1. 合并序列
题目
有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词。
解题报告
模拟,遍历、判断、排序输出即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, N, arr, T):
result = [a for a in arr if a.startswith(T)]
return sorted(result)
if __name__ == "__main__":
N = int(input().strip())
arr = []
for i in range(N):
arr.append(input().strip())
T = input().strip()
sol = Solution()
result = sol.solution(N, arr, T)
print("\\n".join(result))
2. 千问万问
题目
给定大小为n的整数序列A. 现在会有q次询问,询问子区间的整数数量。
解题报告
模拟,遍历、判断输出即可,但官方说测试数据有问题,代码仅供参考
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, q, nums, arr):
result = []
nums = sorted(nums)
for l, r in arr:
result.append(len([i for i in nums if i >= l and i <= r]))
return map(str, result)
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
q = int(arr_temp[1])
nums = [int(item) for item in input().strip().split()]
arr = []
for i in range(q):
arr.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, q, nums, arr)
print(" ".join(result))
3. 连续子数组的最大和
题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和 。
解题报告
动态规划,经典最大子段和
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
result = arr[0]
s = arr[0]
for x in arr[1:]:
if s >= 0:
s += x
else:
s = x
result = max(result, s)
return result
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(result)
4. 降水量
题目
给定n个柱面的高度,表示降雨某地n块区域的海拔高度。 计算降雨之后该地最大储水面积。如果低于地平线,也就是小于0,则一定积水
解题报告
模拟,维护左右两个指针 l, r 及两侧的最大高度 ll, rr,显然 ll = maxarr[l], rr = maxarr[r]
若 ll < rr 则 l 往右挪并把 ll - arr[l] 累计起来;反之则把 r 往左挪并把 rr - arr[r] 累计起来
最终 l > r 时结束并输出结果即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
result = 0
l = 0
r = n - 1
ll = max(arr[l], 0)
rr = max(arr[r], 0)
while l <= r:
ll = max(ll, arr[l])
rr = max(rr, arr[r])
if ll < rr:
result += ll - arr[l]
l += 1
else:
result += rr - arr[r]
r -= 1
return result
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(result)
以上是关于[解题报告] CSDN竞赛第21期的主要内容,如果未能解决你的问题,请参考以下文章