思路:总和来自两个部分,一部分是初始就可以选择的,这部分是固定所以不用考虑,另一部分是选择的区间内由不可选变到可选的数字总和,用滑动窗口来统计该部分并求出最大值。
每次滑动窗口移动时,右侧判断该数字初始是否可选然后分别加入不同的变量中,窗口长度达到限制则移动左侧,判断左侧数字初始是否可选,只有初始不可选的数字应该减去。这样一次遍历就可以解决该问题。
n, k = map(int, input().split())
nums = list(map(int, input().split())) # 原数组
freq = list(map(int, input().split())) # 初始可选状态数组
s = 0 # 当前滑动窗口内初始不可选的数字总和
cnt = 0 # 滑动窗口内初始不可选的数字总和的历史最大值
opt = 0 # 原数组内初始可选数字的总和
left, right = 0, 0 # 滑动窗口左右边界
while right < n:
if freq[right] == 1: # 判断右边界的数字初始是否可选
opt += nums[right]
else:
s += nums[right]
if right - left + 1 >= k: # 窗口滑动
cnt = max(cnt, s)
if freq[left] == 0: # 移动左侧窗口
s -= nums[left]
left += 1
right += 1
print(cnt + opt)