一. 总体情况
得分: 25+25+10+25=85 (排名第 9)
二. 题目分析
第一题: 排查网络故障
题目
分析
本题十分简单, 只需考虑最坏情况, 从而尽量找靠中间的管道检查, 然后递推即可 (当然也可以一次性建立表达式).
代码
import math
def find_times(n):
if n==2:
return 0
return find_times(math.floor(n/2)+1)+1
class Solution:
def __init__(self) -> None:
pass
def solution(self, n):
result = None
result = find_times(n+2)
return result
if __name__ == "__main__":
n = int(input().strip())
sol = Solution()
result = sol.solution(n)
print(result)
第二题: 零钱兑换
题目
分析
本题的输入处理确实有点耗时 qwq, 但其他部分还好, 一个简单的动态规划就能解决问题 (循环中看一下把 i i i 局部换成 i − j i-j i−j 能否达到更好效果).
代码
class Solution:
def __init__(self) -> None:
pass
def solution(self, arr, targ):
result = None
dp = [targ + 1]*(targ +1)
dp[0] = 0
for i in range(1, targ + 1):
for j in arr:
if j <= i:
dp[i] = min(dp[i], dp[i-j]+1)
if dp[targ] > targ:
return -1
else:
return dp[targ]
return result
if __name__ == "__main__":
strr = input().strip()
strtmp = strr.split(',')
str1 = []
targ=0
l = len(strtmp)
if l==2:
str1 = strtmp[0][1:-1]
targ = strtmp[1]
else:
for j in range(l-1):
if j==0:
str1.append(strtmp[j][1:])
elif j==l-2:
str1.append(strtmp[j][:-1])
else:
str1.append(strtmp[j])
targ = strtmp[l-1]
newstr1 = [int(item) for item in str1]
newaim = int(targ)
sol = Solution()
result = sol.solution(newstr1, newaim)
print(result)
第三题: 清理磁盘空间
题目
第四题: 交际圈
题目
分析
经典的并查集问题: 详情可以看这里: 传送门. 主要策略在于路径压缩.