问题描述
我正在使用 Python 解决 Google kick start 2021 Round B 中的最长进度问题。
这是问题的链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000435a5b
我已经编写了以下代码,但似乎在测试用例中总是有错误的答案,就我而言,我已经尝试了所有情况,有人可以帮助我了解代码中的问题在哪里,谢谢!
def solution(A,N):
i,j = 0,1
ranges = {}
res = 0
left = {}
right = {}
while j < N:
diff = A[j] - A[i]
while j < N and A[j]-A[i] == (j-i)*diff:
j += 1
ranges[(i,j-1)] = diff
left[i] = (i,j-1)
right[j-1] = (i,j-1)
if j <= N-1 or i > 0:
res = max(res,j-i+1)
else:
res = max(res,j-i)
i = j-1
# check if two ranges can be merged
for i in range(1,N-1):
if i == 1:
if i+1 in left:
l1,r1 = left[i+1]
if A[i+1]-A[i-1] == 2*ranges[left[i+1]]:
res = max(res,r1-l1+3)
elif i == N-2:
if i-1 in right:
l1,r1 = right[i-1]
if A[i + 1] - A[i - 1] == 2 * ranges[right[i - 1]]:
res = max(res,r1 - l1 + 3)
else:
if i+1 in left and i-1 in right and ranges[right[i-1]] == ranges[left[i+1]]:
l1,r1 = right[i - 1]
l2,r2 = left[i+1]
if A[i+1]-A[i-1] == 2*ranges[left[i+1]]:
res = max(r1-l1+r2-l2+3,res)
return res
if __name__ == "__main__":
T = int(input().strip())
for i in range(T):
N = int(input().strip())
A = list(map(int,input().strip().split(" ")))
res = solution(A,N)
print("Case #{}: {}".format(i+1,res))
解决方法
合并逻辑不正确。该代码仅尝试合并整个范围。在一个简单的失败案例中
1 2 3 6 5 4
它没有将 6
替换为 4
会产生 1 2 3 4 5
。