第一行 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);