前缀和——Subsequences Summing to Sevens S

[USACO16JAN] Subsequences Summing to Sevens S

题目描述

Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a photo of a contiguous group of cows but, due to a traumatic childhood incident involving the numbers 1 … 6 1 \ldots 6 16, he only wants to take a picture of a group of cows if their IDs add up to a multiple of 7.

Please help FJ determine the size of the largest group he can photograph.

给你n个数,分别是a[1],a[2],…,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],…,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。

输入格式

The first line of input contains N N N ( 1 ≤ N ≤ 50 , 000 1 \leq N \leq 50,000 1N50,000). The next N N N

lines each contain the N N N integer IDs of the cows (all are in the range

0 … 1 , 000 , 000 0 \ldots 1,000,000 01,000,000).

输出格式

Please output the number of cows in the largest consecutive group whose IDs sum

to a multiple of 7. If no such group exists, output 0.

样例 #1

样例输入 #1

7
3
5
1
6
2
14
10

样例输出 #1

5

提示

In this example, 5+1+6+2+14 = 28.

思路

题目有要求整除,因此我们就改成模数,在预处理前缀和的时候预处理出模数。然后我们只要判断 s j = s i − 1 , 1 ≤ i , j ≤ n s_j=s_{i-1},1\leq i,j\leq n sj=si11i,jn在此,我们可以进行相应的优化:

  • 优化1:题目要求求出最大的,我们可以把ans放在for循环上,只有当ans<j-i+1时,我们才更新ans

代码

#include<cstdio>
#define int long long

using namespace std;

const int N = 5e5+10;

int s[N],n;

signed main(){
    scanf("%lld",&n);
    
    for(int i=1;i<=n;i++){
        int x;
        scanf("%lld",&x);
        s[i]=(s[i-1]+x)%7;
    }
    
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=i+ans+1;j<=n;j++){//因为是最长的区间,所以+ans
            if(s[j]==s[i-1]){
                if(ans>=j-i+1)break;
                ans=j-i+1;
            }
        }
    }
    printf("%lld",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值