小明的花坛

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;
}