【NOI OL #3】水壶

题目链接

因为水壶只能倒水给相邻的下一个水壶,而且最后只能喝掉一个水壶里的水,所以喝掉的水壶里的水一定来自于左侧的连续子序列之和,而用在其他地方的倒水次数都浪费了。

所以最优解就是长度为$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;

}
View Code

 

posted @ 2020-05-25 18:18  汉谡  阅读(152)  评论(0编辑  收藏  举报