学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客
【题目描述】
给定一个长度为n的整数序列,请找出长度不超过m的连续子序列的最大和。
例如,数组{2,-3,5,2,-4,-1,8},m取3,那么长度不超过3的连续子序列的最大和为8。
【代码详解】
a= [0, 2, -3, 5, 2, -4, -1, 8]
s = [0]
x = 0
for i in range(1, len(a)):
x += a[i]
s.append(x)
m = 3
ans = s[1]
for i in range(1, len(s)):
mi = 1000000
for j in range(i-m, i):
if j >= 0:
mi = min(mi, s[j])
ans = max(ans, s[i] - mi)
print(ans)
#单调队列
a= [0, 2, -3, 5, 2, -4, -1, 8]
q = [0,1,2,3,4,5,6,7]
s = [0]
x = 0
m = 3
for i in range(1, len(a)):
x += a[i]
s.append(x)
h = 0
t = 0
ans = s[1]
for i in range(1, len(a)):
#q[h]不在窗口[i-m, i-1]内,队头出队
if h<=t and q[h]<i-m:
h += 1
#使用队头最小值
ans = max(ans, s[i]-s[q[h]])
#当前值<=队尾值,队尾出队
while h<=t and s[i]<=s[q[t]]:
t -= 1
#下标入队,便于队头出队
t+=1
q[t] = i
print(ans)
【运行结果】
8