「USACO2016JAN」Subsequences Summing to Sevens

发布时间 2023-05-09 20:59:29作者: Momo·Trace

[USACO16JAN]Subsequences Summing to Sevens S

题目描述

Farmer John's \(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 \ldots 6\), 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\) (\(1 \leq N \leq 50,000\)). The next \(N\)

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

\(0 \ldots 1,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.

代码

#include <bits/stdc++.h>
using namespace std;
int n,q[1000100],pre[1000100],las[1000100];//pre数组用来记录余数在数组第一次出现的位置,las数组记录最后一次出现的位置
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>q[i];
		q[i]=(q[i]+q[i-1])%7;
	}
	for(int i=1;i<=n;i++)//从头到尾遍历,那么最后一次更新的位置就会被记录在las数组中,也就是余数最后一次出现的位置
	{
		las[q[i]]=i;
	}
	for(int i=n;i>=0;i--)//从尾到头遍历,那么最后一次更新的位置就会被记录在pre数组中,也就是余数第一次出现的位置
	{
		pre[q[i]]=i;
	}
	int maxn=0;
	for(int i=1;i<7;i++)
	{
		maxn=max(las[i]-pre[i],maxn);
	}
	cout<<maxn;
	return 0;
}