【洛谷P3131】 【USACO16JAN】子共七

来源:互联网 发布:seo h1标签用法 编辑:程序博客网 时间:2024/06/05 04:07

P3131 [USACO16JAN]子共七Subsequences Summing to Sevens


题目描述

Farmer John's 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, 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个数,求一个最长的区间,使得区间和能被7整除

输入输出格式

输入格式:

The first line of input contains (). The next

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

).

输出格式:

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:
7351621410
输出样例#1:
5

说明

In this example, 5+1+6+2+14 = 28.

这个题我看了一些题解的代码,发现


自己的代码真是太棒了!


不要问我为什么都用了longlong,数组开的那么大,因为我下面会解释的


我第一次交了80分,然后十分自信地认为开小数组或者没用longlong,然后改了,然后就过了


写一写题解吧,首先是进制的转化,这里用的是很常规的取摸(不懂得童鞋可以自行百度进制转换方法,这种方法很类似于短除法)。


先记录一个前缀和。两个前缀和mod7同余,则这两个前缀和的差值一定被7整除。


这里采取记余数,b[i]表示余数为i的前缀的最小下标


好了看程序吧,正确性应该是显然的

不懂得私信评论或Q:568251782均可

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>const int MAXN = 50000 + 10;long long sum[MAXN],n;long long b[7];long long ans;int main(){scanf("%d", &n);for(long long i = 1;i <= n;i++){int num;scanf("%d", &num);sum[i] = sum[i-1] + num;}for(int i = 1;i <= n;i++){long long a;a = sum[i] % 7;if(a == 0){ans = i;}else if(b[a]){if(ans < i - b[a]){ans = i - b[a];}}else{b[a] = i;}}printf("%d", ans);return 0;}


0 0
原创粉丝点击