题目描述:
有一个广为流传的神话:“凑齐七颗龙珠,就可以召唤神龙”。小Z听到这个传说以后激动不已,下定决心一定要凑齐七颗龙珠,召唤神龙。从此,小Z踏上了寻找七龙珠的艰辛路途,经过漫长而又艰苦的跋涉,小Z终于找到了传说中的龙珠山,此情此景,让小Z激动不已,小Z仰天大笑:“哈哈哈, 我终于可以召唤神龙了”。然而就在他笑声结束的一刹那,一个白胡子老爷爷出现了,他对小Z说道:“小伙子,不要高兴的太早,规则改了,你首先要破解我的谜题,才可以召唤神龙”,小Z大惊失色,赶忙问道什么谜题?白胡子老爷爷手一挥,在小Z的面前出现了N颗排成一行的龙珠,每个龙珠上都有一个数字D,白胡子老爷爷说道,你可以从这N个龙珠中,选出连续的一些龙珠,但是有三个要求,第一,只可以连续的选取,不可以跳着选。第二:你选出的所有龙珠上的数字之和必须是7的倍数。第三:选取的龙珠要尽可能的多。最后白胡子老爷爷说道:“看你辛辛苦苦来到这里也不容易,你只需要告诉我在满足条件的前提下,最多可以收集到多少颗龙珠就可以了”。听到这里小科已经傻了,显然作为一个勇士,解决这类问题不是小科的强项,现在小Z希望你能帮他解决这个问题,如果你能成功的帮助他解决这个问题,他会把神龙借你骑几天。
输入格式
输入文件:sevenbead.in
第一行:一个正数N,代表龙珠的总数量。
第二行:N个用空格分隔的正整数,其中第i个正整数代表第i个龙珠上的数字Di。
输出格式
输出文件:sevenbead.out
一行,一个正整数,可以选取的龙珠的最大数量,如果不存在满足条件的龙珠则输出0.
输入样例1:
8 1 8 7 6 5 4 2 3
输出样例1:
7
输入样例2:
3 1 2 3
输出样例2:
0
输入样例3:
5 7 1 1 1 1
输出样例3:
1
说明:
样例1:8 + 7 + 6 + 5 + 4 + 2 + 3 = 35是7的倍数。最多可选取7个连续的龙珠。
样例2:无路如何选取,都无法得到7的倍数,输出0;
样例3:只可以选择第1颗龙珠。
【数据范围】
1 <= N <= 100000; 1<=Di <=10^9
【耗时限制】1000ms 【内存限制】128MB
说不多说,直接上代码;
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <sstream>
#include <cstring>
#include <algorithm>
using namespace std;
long long a[100005],sum[100005];
int L[100005],R[100005];
int main(){
int n,maxn=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
sum[i]=(sum[i-1]+a[i])%7;
}
for(int i=1;i<=n;++i){
int x=sum[i]%7;
if(L[x]==0&&x!=0){
L[x]=i;
}else{
R[x]=i;
}
}
for(int i=0;i<=6;i++){
if(R[i]!=0)maxn=max(maxn,R[i]-L[i]);
}
cout<<maxn;
return 0;
}