做题历程
拿到手的时候就是考虑前缀和,毕竟要求区间和,如果暴力做就是N3,那么就开始做,写了个O(n2)复杂度代码,交上去80分...迷了,心想这题难道dp啊,懒得想的我直接看题解,发现大佬用了一个很简单的模运算性质就过去了,即(a - b) mod 7 == 0 那么 a = b (mod 7)。但是真有大佬dp做的。那么根据大佬说的这个性质直接写代码,就过去了。
AcCode:
#include<bits/stdc++.h>
using namespace std;
long long sum[50010], vis[7];
int main(){int N, maxLength = 0;memset(vis, -1, sizeof(vis));cin >> N;for(int i = 1; i <= N; i++){cin >> sum[i];sum[i] = sum[i] + sum[i - 1];}for(int i = 0; i <= N; i++){int path = sum[i] % 7;if(vis[path] == -1) vis[path] = i; //记录第一个mod7的值的位置else{if(i - vis[path] > maxLength) maxLength = i - vis[path]; //往后找,更新最长区间}}cout << maxLength; return 0;
}