题目链接
因为水壶只能倒水给相邻的下一个水壶,而且最后只能喝掉一个水壶里的水,所以喝掉的水壶里的水一定来自于左侧的连续子序列之和,而用在其他地方的倒水次数都浪费了。
所以最优解就是长度为$k+1$的最大子序列之和。因为元素全都是自然数,所以预处理前缀和,枚举区间起点求最大即可。
代码(100分):

#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<map> #include<set> #define IL inline #define RG register #define _1 first #define _2 second using namespace std; const int N=1e6; int n,k,a[N+3]; int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[0]=0; for(int i=1;i<=n;i++) a[i]+=a[i-1]; int ans=0; for(int i=1;i+k<=n;i++) ans=max(ans,a[i+k]-a[i-1]); printf("%d",ans); return 0; }