[解题报告] CSDN竞赛第22期
Posted AlgoComp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第22期相关的知识,希望对你有一定的参考价值。
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/36
1. c++难题-大数加法
题目
大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。
解题报告
模拟,相加即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, m):
return n + m
if __name__ == "__main__":
n = int(input().strip())
m = int(input().strip())
sol = Solution()
result = sol.solution(n, m)
print(result)
2. 最长回文串
题目
找出最先出现的最长回文串 (“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串)
解题报告
动态规划,设 f[i][j] 表示字符串区间 [i, j] 是否为回文串,则
f [ i ] [ j ] = 1 j = i s [ i ] = = s [ j ] j = i + 1 s [ i ] = = s [ j ] and f [ i + 1 ] [ j − 1 ] j > i + 1 f[i][j] = \\begincases 1 & j = i \\\\ s[i] == s[j] & j = i + 1 \\\\ s[i] == s[j] \\text and f[i + 1][j - 1] & j > i + 1 \\endcases f[i][j]=⎩ ⎨ ⎧1s[i]==s[j]s[i]==s[j] and f[i+1][j−1]j=ij=i+1j>i+1
答案为使得 f[i][j] = 1 的最大 j - i + 1,相同时取小的 i,输出 s[i:j + 1] 即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, s):
n = len(s)
f = [[0] * n for i in range(n)]
l = ans = 0
for i in range(n):
for j in range(i):
f[j][i] = (s[i] == s[j]) and (j == i - 1 or f[j + 1][i - 1])
if f[j][i] and ans < i - j + 1:
ans = i - j + 1
l = j
f[i][i] = 1
return s[l:l + ans]
if __name__ == "__main__":
str = input().strip()
sol = Solution()
result = sol.solution(str)
print(result)
3. 求最小元素
题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转,请找到数组中最小元素,(例如数据[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2],最小元素是0)。您可以假设阵列中不存在重复项。
解题报告
模拟,输出 min(arr) 即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
return min(arr)
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,然后给出数字 m,则需在 n 中去掉 m 位数,保持各位顺序不变的情况下,得到最大数。
解题报告
模拟,显然答案长度为 s = len(n) - m,遍历答案每一位数 a[i], 0 <= i < s
a[i] = maxn[j], k < j <= m + i,k 为上一位数在 n 中的位置,初始时 k = -1
最后输出 a 即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, m):
m = int(m)
s = len(n) - m
k = 0
a = ['0'] * s
for i in range(s):
for j in range(k, m + i + 1):
if a[i] < n[j]:
a[i] = n[j]
k = j + 1
return ''.join(a)
if __name__ == "__main__":
n, m = [item for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, m)
print(result)
以上是关于[解题报告] CSDN竞赛第22期的主要内容,如果未能解决你的问题,请参考以下文章