3810 最长连续休息时间(破环成链)

1. 问题描述:

一天可以被分为 n 个时段。一个工人的每日工作安排可以用一个长度为 n 的 01 序列 a1,a2,…,an 来表示。ai 为 0 表示第 i 个时间段是工作时间,ai 为 1 表示第 i 个时间段是休息时间。工人日复一日的严格按照这个工作安排来进行工作和休息。请问,工人的最长连续休息时间有多长(单位:时段)?注意,连续休息时间可能跨天。保证工人至少在一个时间段处于工作状态。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含整数 n。第二行包含 n 个整数 a1,a2,…,an。

输出格式

每组数据输出一行结果,表示最长连续休息时间。

数据范围

1 ≤ T ≤ 10,
1 ≤ n ≤ 2 × 10 ^ 5,
0 ≤ ai ≤ 1,
同一测试点内所有 n 的和不超过 2 × 10 ^ 5。

输入样例:

4
5
1 0 1 0 1
6
0 1 0 1 1 0
7
1 0 1 1 1 0 1
3
0 0 0

输出样例:

2
2
3
0
来源:https://www.acwing.com/problem/content/3813/

2. 思路分析:

分析题目可以知道实际上是已知一个长度为n的环,我们需要求解出环中最长的连续的1的长度,对于环的相关问题我们可以将其转化为链来解决,其中比较常用的一个技巧是将原数组复制一遍接在原数组的后面,这样环中所有长度为n的链都可以在长度为2n的链中找到,所以我们在长度为2n的链中找到最长的连续的1的长度即可。

3. 代码如下:

class Solution:
    def process(self):
        T = int(input())
        for c in range(T):
            n = int(input())
            a = list(map(int, input().split()))
            # 将a的全部元素复制一遍放在后面
            for i in range(n):
                a.append(a[i])
            i = res = 0
            while i < 2 * n:
                if a[i] == 1:
                    # 双指针求解连续的1的长度
                    j = i + 1
                    while j < 2 * n and a[j] == 1: j += 1
                    res = max(res, j - i)
                    i = j
                i += 1
            print(res)


if __name__ == "__main__":
    Solution().process()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是最长连续子序列的问题描述和解决思路: 【问题描述】 给定一个整数序列,找出其中最长连续子序列(至少包含2个元素),使得所有子序列元素之和相等,并返回该子序列的长度。 【解决思路】 这是一道典型的动态规划问题,我们可以用动态规划来解决。 我们可以先计算出整个序列的元素之和sum,然后设dp[i]表示以第i个元素结尾的最长连续子序列的长度。如果前i个元素的元素之和为sum,则前i个元素的最长连续子序列的长度为i,因为前i个元素中任意一个长度为i的子序列的元素之和都等于sum。如果前i个元素的元素之和不为sum,则可以在前i-1个元素中找到一个最长连续子序列,使得该子序列的元素之和等于sum - nums[i],然后将第i个元素加入该子序列中,得到以第i个元素结尾的最长连续子序列。 因此,状态转移方程为: ``` dp[i] = i if sum(nums[:i+1]) == sum max(dp[j]+i-j if sum(nums[j:i+1]) == sum - nums[i] else 0 for j in range(i)) ``` 其中,sum(nums[:i+1])表示前i+1个元素的元素之和,sum - nums[i]表示前i个元素中除去第i个元素的元素之和。 最终,最长连续子序列的长度等于dp中的最大值。 【Python代码实现】 下面是一个简单的Python函数,用于计算最长连续子序列的长度: ```python def longest_continuous_subsequence(nums): """ 计算最长连续子序列的长度 """ if not nums: return 0 sum = 0 for num in nums: sum += num dp = [0] * len(nums) for i in range(len(nums)): if sum(nums[:i+1]) == sum: dp[i] = i else: dp[i] = max(dp[j]+i-j if sum(nums[j:i+1]) == sum - nums[i] else 0 for j in range(i)) return max(dp) ``` 注意,这里使用了Python内置的sum函数,用于计算序列中所有元素的和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值