微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2021 年 B 轮 Google kick start 的算法问题

如何解决2021 年 B 轮 Google kick start 的算法问题

我正在使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。