小明的花坛
O(n)时间,O(n)空间。前缀和。
#include <stdio.h>
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{ // t 组数据
int n,k,i,s=0;
long long int sum=0,m=0,num=0; // 累加有可能爆 int
scanf("%d %d",&n,&k); // 所以用 lld
long long int a[n]; // 存储 a[i] 的时候也用 lld
int b[n];
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
if(b[i]==1) // 把 不缺水的花 的漂亮值
sum+=a[i]; // 累加到 sum 里面
}
for(i=0;i<k;i++) // 遍历第一个长度为 k 的区间
if(b[i]==0) // 如果此花缺水
m+=a[i]; // 加起来
num=m; // 给 num 赋一个初始值
for(i=k;i<n;i++)
{ // 然后遍历剩下的数组
if(b[s]==0) // s = i-k,为区间起点
m-=a[s]; // 只对缺水的花进行操作
s++; // 起点后移
if(b[i]==0) // 如果区间终点缺水
m+=a[i]; // 累加
if(m>num) // 该区间 缺水的花 的漂亮值与上次的结果进行比较
num=m; // 取最大值
}
printf("%lld\n",sum+num); // 输出所有的 1,和最有价值的 0
}
return 0;
}