3.小蓝的金牌梦【算法赛】 - 蓝桥云课 (lanqiao.cn)
先前缀和求每一段区间的和,然后筛一下所有下标i为素数的,在这里面找最大区间。
区间和:1 3 6 10 15 21
打表:
sum[j]: 3 6 10 15 21 6 10 15 21 21 15 21
sum[j-1]:0 1 3 6 10 0 1 3 6 3 0 1
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans= INT_MIN;
const int N=1e5+10;
int sum[2*N];
bool isprime(int n)
{
if(n<2)return false;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)return false;
}
return true;
}
signed main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sum[i];
sum[i]+=sum[i-1];
}
for(int i=2;i<=n;i++)
{
if(isprime(i))
{
for(int j=i;j<=n;j++) //每一段区间
{
ans=max(ans,sum[j]-sum[j-i]);
}
}
}
cout<<ans;
return 0;
}