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

Posted AlgoComp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解题报告] CSDN竞赛第20期相关的知识,希望对你有一定的参考价值。

CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/34

1. 非降序数组

题目

写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C(不要使用内置 sort 函数)。

解题报告

模拟,排序输出即可

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, n, m, num1, num2):
        result = sorted(num1 + num2)
        return map(str, result)


if __name__ == "__main__":
    arr_temp = [int(item) for item in input().strip().split()]
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    num1 = [int(item) for item in input().strip().split()]
    num2 = [int(item) for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(n, m, num1, num2)
    print(" ".join(result))

2. 吃!吃!吃!

题目

已知n个整数。 每3个数算一个周期。 不足一个周期补0. 在周期的第一个位置的数的权值和等于a1+a[1+3]+… … 第二个位置的数的权值和等于a2+a[2+3]+… … 求三个数的最大权值。 如果最大权值为第一个数,输出’J’; 最大权值为第二个数,输出’H’; 最大权值为第三个数,输出’B’。

解题报告

模拟,a[i % 3] = sum(arr[i]),再判断 a[0], a[1], a[2] 是否为最大值而输出 J H B

class Solution:
    def __init__(self) -> None:
        pass

    def solution(self, n, arr):
        a = [0] * 3
        for i in range(n):
            a[i % 3] += arr[i]
        if a[0] > a[1] and a[0] > a[2]:
            return 'J'
        if a[1] > a[0] and a[1] > a[2]:
            return 'H'
        return 'B'


if __name__ == "__main__":
    n = int(arr_temp[0])
    arr = [item for item in input().strip().split()]
    sol = Solution()
    result = sol.solution(n, arr)
    print(result)

3. 计算逆波兰表达式的结果

题目

逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) -”;后者写做“3 4 - 5 *”。

解题报告

模拟,维护一个栈,若是数字则入栈,否则出栈两个数字并进行运算,再把结果入栈,最后栈里剩下的数字即为答案

class Solution:
    def __init__(self) -> None:
        pass

    def calc(self, x, y, c):
        if c == '/':
            c = '//'
        return eval(f'x c y')

    def solution(self, arr):
        stack = []
        for c in arr:
            if c in ['+', '-', '*', '/']:
                x = stack.pop()
                y = stack.pop()
                stack.append(self.calc(x, y, c))
            else:
                stack.append(int(c))
        return stack.pop()


if __name__ == "__main__":
    arr = input().strip().split()
    sol = Solution()
    result = sol.solution(arr)
    print(result)

4. 会议安排

题目

开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边)
小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。
她决定用现有的布局当作是会议座位安排。
每个桌子分配一个人。相邻桌子不同的桌子颜色不同。
小艺想知道选择某个桌子之后老大身边能围多少人?

输入描述:

第一行输入2个整数n,m,一个字符c。(1<=n,m<=100)分别表示空间大小和老大指定的桌椅颜色号。
以下n行每行m个字符。’.’代表空地,其他字符表示桌椅。连接在一个且相同的字符表示一个桌子。

输出描述:

输出围着老大的人数。

输入样例:

3 4 R
G.B.
BRRA
TTT.

输出样例:

4

解题报告

图论,先按字符用 floodfill 求出所有连通块

再枚举 c 所在的连通块周围的连通块 id 集合,输出集合大小即可

class Solution:
    def __init__(self) -> None:
        self.dx = [-1, 0, 1, 0]
        self.dy = [0, -1, 0, 1]

    def dfs(self, x, y):
        self.v[x][y] = self.s
        for k in range(4):
            xx = x + self.dx[k]
            yy = y + self.dy[k]
            if xx >= 0 and xx < self.n and yy >= 0 and yy < self.m:
                if self.v[xx][yy] == 0 and self.a[xx][yy] == self.a[x][y]:
                    self.dfs(xx, yy)

    def solution(self, n, m, c, vector):
        self.n = n
        self.m = m
        self.a = vector
        self.v = [[0 for j in range(m)] for i in range(n)]
        self.s = 0
        for i in range(n):
            for j in range(m):
                if self.v[i][j] == 0:
                    self.s += 1
                    self.dfs(i, j)
        result = set()
        for x in range(n):
            for y in range(m):
                if self.a[x][y] == c:
                    for k in range(4):
                        xx = x + self.dx[k]
                        yy = y + self.dy[k]
                        if xx >= 0 and xx < self.n and yy >= 0 and yy < self.m:
                            if self.a[xx][yy] != '.' and self.a[xx][yy] != self.a[x][y]:
                                result.add(self.v[xx][yy])
        return len(result)


if __name__ == "__main__":
    arr_temp = [item for item in input().strip().split()]
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    c = arr_temp[2]
    vector = []
    for i in range(n):
        vector.append(input().strip())
    sol = Solution()
    result = sol.solution(n, m, c, vector)
    print(result)

以上是关于[解题报告] CSDN竞赛第20期的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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