题意

牛可乐最近接到了牛客网的一个出题任务,要他在图片说明 天内出尽可能多的题目,牛可乐知道自己每一天分别可以出多少题。但是牛可乐有一种毛病,那就是懒癌,当懒癌发作时,牛可乐就出不了题了。万幸的是,牛可乐还知道自己哪天会懒癌发作,而且可以连续图片说明 天控制住自己的懒癌,在这天里,牛可乐是可以正常出题的,但是牛可乐只能控制住一次自己的懒癌。牛可乐想知道自己在这图片说明 天里最多可以出多少道题。

解法1

首先,不会发病的那些天是可以正常出题的。所以首先把这些天出的题数算上。然后我们可以用一个两重循环把每连续K天中所有犯懒癌的天数可以出的题目数量相加,并求出其中的最大值,与不犯病的天数相加,就得出了最后的答案。

时间复杂度:

空间复杂度:

代码

class Solution {
public:
/**
*
* @param a int整型vector 牛可乐每天分别可以出的题目数量
* @param b int整型vector 每个数字为0或者1,1表示牛可乐这一天会犯懒癌,0表示不会犯懒癌
* @param k int整型 牛可乐可以连续k天控制自己的懒癌
* @return int整型
*/
int lazyNKL(vector& a, vector& b, int k) {
// write code here
    int ans=0,n=a.size();
    for(int i=0;i<n;i++)
    if(b[i]==0)
       ans+=a[i];
   int ans2=0;
   for(int i=k;i<=n;i++)
  {
     int t=0;
    for(int j=i-k;j<i;j++)
    if(b[j]==1)
     t+=a[j];
    ans2=max(ans2,t);
    }
  return ans+ans2;
}
};

解法2

事实上,我们可以用前缀和来优化上述代码的二重循环部分,从而将时间复杂度降为图片说明
时间复杂度:图片说明

时间复杂度:图片说明

代码

class Solution {
public:
/**
*
* @param a int整型vector 牛可乐每天分别可以出的题目数量
* @param b int整型vector 每个数字为0或者1,1表示牛可乐这一天会犯懒癌,0表示不会犯懒癌
* @param k int整型 牛可乐可以连续k天控制自己的懒癌
* @return int整型
*/
int lazyNKL(vector& a, vector& b, int k) {
// write code here
int ans=0,n=a.size();
for(int i=0;i<n;i++)
{
  if(b[i]==0)
  ans+=a[i];
  a[i]*=b[i];
  if(i>0)
  a[i]+=a[i-1];
 }
 int ans2=a[k-1];
 for(int i=k;i<n;i++)
 ans2=max(ans2,a[i]-a[i-k]);
  return ans2+ans;
}
};