1 #include<iostream>
2 using namespace std;
3
4 /*
5 原题地址:https://www.luogu.com.cn/problem/P3131
6 农夫约翰的 \( N \) 头奶牛站在一排,就像它们时不时做的那样。每头奶牛都有一个唯一的整数ID号,
7 这样农夫约翰可以区分它们。农夫约翰想要给一组连续的奶牛拍照,但由于他童年时的一次创伤事件涉及
8 数字 1 到 6,他只会在奶牛的ID号之和是7的倍数时才拍照。
9 请帮助农夫约翰确定他可以拍摄的最大奶牛组的大小。
10
11 示例数据输入:
12 10
13 3 1 4 10 5 9 2 6 8 7
14 */
15
16 int main() {
17 int a, b[100] = {0}, n, i, ans = 0;
18 int first[7] = {0, -1, -1, -1, -1, -1, -1}, last[7]={0};
19 cin >> n; // 假设有十头牛,这里n输入10
20 for (i = 1; i <= n; i++) {
21 cin >> a; // 将每一头牛的ID进行输入,可以参考上面的数据输入示例
22 b[i] = (a + b[i-1]) % 7; // 初始化ID的同时,对每个前缀和进行模7的操作,也就是除以7的余数放b数组里面
23 if (first[b[i]] == -1)first[b[i]] = i; // 记录每个模数第一次出现的位置,模数就是first数组的索引
24 last[b[i]] = i; // 记录每个模数最后一次出现的位置
25 }
26
27 for (i = 0; i < 7; i++)
28 if (first[i] != -1)
29 ans = (last[i] - first[i] > ans) ? (last[i] - first[i]) : ans; // 获取最大长度
30 cout << ans << endl;
31 return 0;
32 }