蓝桥杯算法双周赛小白赛第三题

刚上大一的小蓝,励志成为一名成功的 \text{acmer}acmer,斩获金牌。

最近,小蓝刚学习了经典问题中的最大子数组和问题。最大子数组和问题是 ACM 竞赛选手入门必学的一个问题,它要求在给定数组 aa 中选取一段连续子数组,使得该子数组的元素和达到最大值。

当然小蓝对自己的要求比较高,恰巧他刚学习了质数的知识,他想知道如果选取的子数组长度必须为质数的情况下,最大的子数组和能是多少呢?

请你帮忙解决这个问题。

这个题其实是关于一个前缀和的问题并且利用了质数的判断,首先要判断出前缀和,举一个例子比如1,2,3,4,5,6,那么从1开始接下去1,然后1,2,又是1,2,3......这样,结束后使用set=INT_MIN然后又进入另外一个循环必须i=2,因为要判断质数,接下去又是一个循环使用j=i,使用set=max(set,arr[j]-arr[j-i])这样子能找出所有情况.那么接下来代码

#include<bits/stdc++.h>

#include<iostream>

using namespace std;

bool mm(long long sum){

  for(int i=2;i*i<=sum;i++){

    if(sum%i==0){

      return false;

    }

  }

  return true;

}

int main(){

  long long n;

  cin>>n;

  vector<long long>arr(n+1);

  for(int i=1;i<=n;i++){

    cin>>arr[i];

    arr[i]+=arr[i-1];

  }

  long long set=INT_MIN;

  for(int i=2;i<=n;i++){

    if(mm(i)){

      for(int j=i;j<=n;j++){

        set=max(set,arr[j]-arr[j-i]);

      }

    }

  }

  cout<<set;

  return 0;

}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼di咖波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值