给你n个数,分别是a[1],a[2],…,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],…,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
思路:原本想从长度为n,n-1,n-2……2,1 这样暴力搜索一下,但是最坏情况是O(n^2),果然超时了
于是可以考虑用二分,见代码
#include <bits/stdc++.h>
using namespace std;
#define de(x) cout<<x<<" ";
#define Pu puts("");
#define sf(x) scanf("%d",&x);
typedef long long ll;
const int N=1e6+10,mod=100003;
const int inf=0x3f3f3f3f;
int a[N],pre[N];
int n,m,ans;
int fun(int len){
int t;
for(int i=len;i<=n;i++){
t=(pre[i]-pre[i-len]+7)%7;
if(t==0) return 1;
}
return 0;
}
int main(){
cin>>n;
int x;
for(int i=1;i<=n;i++){
sf(x)
a[i]=x%7;
pre[i]=(pre[i-1]+a[i])%7;
}
int l=0,r=n+1,mid;
while(l<r){
mid=(l+r)>>1;
if(fun(mid)) l=mid+1;
else r=mid;
}
printf("%d\n",l-1);
return 0;
}