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