题目
题目链接
题意
给n个数,求n个数中 最长被7整除的区间和,输出区间长度
思路
-
通过前缀和快速求区间和
-
用同余性质优化
-
若有$$[sum_r-sum_{l-1}]mod7=0 则 sum_r mod 7 =sum_{l-1}mod7$$
坑点
-
注意数据范围 不可以暴力
代码
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5+10;
typedef long long ll;
int num[N];
int sum[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
sum[i]=sum[i-1]+num[i];
}
for(int i=1;i<=n;i++)
{
sum[i]=sum[i]%7;
//cout<<sum[i]<<" ";
}
int maxn=-1;
for(int i=0;i<=6;i++)
{
int l=0,r=0;
for(int j=0;j<=n;j++)//找最开始的i
{
if(sum[j]==i)
{
l=j;
break;
}
}
for(int j=n;j>=1;j--)//找最末尾的i
{
if(sum[j]==i)
{
r=j;
break;
}
}
maxn=max(maxn,r-l);
//cout<<maxn<<endl;
}
cout<<maxn<<endl;
return 0;
}
总结
需要使用前缀和+同余进行优化100分,前缀和+双指针得70分