[解题报告] CSDN竞赛第22期

Posted lijiancheng0614

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][j1]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期的主要内容,如果未能解决你的问题,请参考以下文章

[解题报告] CSDN竞赛第21期

[解题报告] CSDN竞赛第21期

[解题报告] CSDN竞赛第17期

[解题报告] CSDN竞赛第18期

[解题报告] CSDN竞赛第18期

[解题报告] CSDN竞赛第20期