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()