题目链接 http://codeforces.com/problemset/problem/961/B
题意:你和一个同学去上一门课,老师在第i分钟会讲a[i]个知识点。而你的同学在第i分钟,可能会睡,可能会醒。
当b[i]=0,那么他会睡着。当你同学醒着的时候,他会获得在该分钟的老师讲的a[i]个知识点。
你的同学叫你中途叫醒他一次。那么他会清醒k分钟。求你叫醒他的最好策略,让他获取尽可能多的知识点。
题目思路:
先计算该同学处于醒着状态的分数。然后更新a数组,如果醒着已经计算过,那么就计0。
接着,用尺取法计算移动等长区间的最大值。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int a[maxn];
int b[maxn];
int main()
{
// freopen("C://Users//lenovo//deskTop//data.in","r",stdin);
int n,k;
scanf("%d%d",&n,&k);
int sum = 0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++){
if(b[i]){
sum+=a[i];
a[i] =0;
}
}
// printf("%d\n",sum);
int add = 0;
for(int i=0;i<k;i++){
add += a[i];
}
int maxadd = add;
for(int i=k;i<n;i++){
add+= a[i];
add-=a[i-k];
maxadd = max(add,maxadd);
}
printf("%d\n",sum+maxadd);
return 0;
}