第一行 n (1 <= n <= 105), k (0 <= k <= 105) ,表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n 个数,a1, a2, ... , an(1 <= ai <= 104) 表示小易对每分钟知识点的感兴趣评分。
第三行 n 个数,t1, t2, ... , tn 表示每分钟小易是否清醒, 1表示清醒。
小易这堂课听到的知识点的最大兴趣值。
6 3 1 3 5 2 5 4 1 1 0 1 0 0
16
JavaScript 100%通过
let line1 = readline().split(' '),
line2 = readline().split(' ').map(Number),
line3 = readline().split(' '),
n = parseInt(line1[0]),
k = parseInt(line1[1]);
let count = 0,
maxZeroCount = 0,
ZeroCount = 0,
left=0,
right=0;
line3.forEach( (ele,index)=> {
if(ele == 1){
count += line2[index];
}else{
let edge = index + k;
if(edge > n ) {edge = n};
// 第一次计算,以及当left==right相等时计算,
// 因为此时k长度内只有一个‘瞌睡’,下一阶段需要重新计算。
if(left == right){
left = index;
ZeroCount=0;
for(let i=left;i< edge;i++){
if(line3[i] == 0){
ZeroCount += line2[i];
right = i;
}
}
}else{
// 当left!=right时,表明在k长度内,至少有两个‘瞌睡’,多出的‘瞌睡’
// 必然会被下一个k长度计算,所以,可以借此获得两个相邻k长度的交叉范围的值。
// 因此,计算下一个k长度时,只需计算余下部分,节省了运算时间。
ZeroCount -=line2[left];
left = index;
for(let i=right+1;i< edge;i++){
if(line3[i] == 0){
ZeroCount += line2[i];
right = i;
}
}
}
maxZeroCount = Math.max(maxZeroCount,ZeroCount);
}
});
console.log(maxZeroCount + count);