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