2024年蓝桥杯第一场小白赛 小蓝的金牌梦 知识点:前缀和,素数筛

73 阅读1分钟

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;
}