七倍龙珠(sevenbead)

题目描述:
有一个广为流传的神话:“凑齐七颗龙珠,就可以召唤神龙”。小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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值