最长连续休息时间

选自AcWing每日一题

原题链接

#include <bits/stdc++.h>
using namespace std;

const int N=400010;
int a[N];

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        
        for(int i=0;i<n;i++){
            cin>>a[i];
            a[i+n]=a[i];
        }
        
        int ans=0,temp=0;
        for(int i=0;i<2*n;i++){
            
            if(a[i%n]==1){
                temp++;
                ans=max(ans,temp);
            }
            else temp=0; 
            
        }
        
        cout<<ans<<endl;
        
    }
    
    return 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、付费专栏及课程。

余额充值