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 }