美团 回转寿司 Python (未通过,但是也不知道哪错了)

本文介绍了一个寻找连续寿司和最大值的问题,给出了一段Python代码实现。该算法利用前缀和找到最优解,对于输入的测试用例能够正确计算。通过遍历前缀和数组并维护最小前缀和及其索引,找出最大连续子数组和。

问题

3.24:不知道自己哪里写错了,只是通过了 3/10。还很自信的觉得自己没写错 >_<
麻烦走过路过的大佬帮忙瞅下,看看还有啥其他的测试用例,边界条件是我没想到的

题目

小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。
输入描述

第一行输入一个整数T(1<=T<=10),表示数据组数。
每组数据占两行,第一行输入一个整数N(1<=N<=10^5);
第二行输入N个由空格隔开的整数,表示A[1]到A[N](-10^4<=A[i]<=10^4)。

输出描述

每组数据输出占一行,输出一个整数,表示连续若干盘寿司的美味值之和的最大值。

输入测试用例

1
4
3 -2 4 -1

输出测试用例

6

Python 代码

import sys
if __name__ == '__main__':
    T = int(input())
    for _ in range(T):
        N = int(input())
        A = list(map(int, input().split()))
        prefix = [0]
        prefix_sum = 0
        A.extend(A)
        for i in range(2*N):
            prefix_sum += A[i]
            prefix.append(prefix_sum)
        # print(prefix)
        min_prefix, min_idx, ans = sys.maxsize, 0, 0
        for i in range(1, len(prefix)):
            if i - min_idx > N:
                # print(i, " min_idx: ", min_idx)
                break
            ans = max(ans, prefix[i] - min_prefix)
            if prefix[i] <= min_prefix:
                min_prefix = prefix[i]
                min_idx = i
        print(ans)
提供的引用内容中包含回转寿司与线段树的关联信息。过在算法领域,回转寿司问题可以抽象为环形序列的相关问题,而线段树是一种二叉树状的数据结构,常用于高效处理区间查询和更新操作。 在解决回转寿司相关的问题时,如果涉及到环形序列的区间查询(如查询一段连续寿司的某种属性和、最大值等)或区间更新(改变一段连续寿司的属性),可以将环形序列展开为线性序列,然后使用线段树来高效处理这些区间操作。例如,要计算回转寿司中任意连续几个寿司的口味总分,就可以构建线段树来快速得到结果。 以下是一个简单的线段树构建和区间查询的Python示例代码: ```python class SegmentTree: def __init__(self, arr): self.n = len(arr) self.tree = [0] * (4 * self.n) self.build(arr, 0, 0, self.n - 1) def build(self, arr, node, start, end): if start == end: self.tree[node] = arr[start] else: mid = (start + end) // 2 left_child = 2 * node + 1 right_child = 2 * node + 2 self.build(arr, left_child, start, mid) self.build(arr, right_child, mid + 1, end) self.tree[node] = self.tree[left_child] + self.tree[right_child] def query(self, node, start, end, l, r): if r < start or end < l: return 0 if l <= start and end <= r: return self.tree[node] mid = (start + end) // 2 left_child = 2 * node + 1 right_child = 2 * node + 2 left_sum = self.query(left_child, start, mid, l, r) right_sum = self.query(right_child, mid + 1, end, l, r) return left_sum + right_sum # 示例使用 sushi_tastes = [1, 2, 3, 4, 5] segment_tree = SegmentTree(sushi_tastes) print(segment_tree.query(0, 0, len(sushi_tastes) - 1, 1, 3)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值