最大值(前缀和)
第1题 最大值 查看测评数据信息
在一个遥远的星球上,有 n 个特殊的饮水器,它们按照从 1 到 n 的顺序排列。每个饮水器都有一个内置的储水罐,初始时第 i 个饮水器的储水罐中有 A[i] 单位的水。
这个星球的居民有一种特殊的能力,他们可以进行不超过 k 次的水流转移操作。每次操作,他们可以选择一个饮水器(编号为 x,满足 1 <= x < n),并将其中的所有水通过特殊管道倒入它后面的一个饮水器(编号为 x+1)。
最终,居民们可以选择任意一个饮水器,并喝掉其中的所有水。现在,他们想知道通过合理的操作,他们最多能喝到多少单位的水。
输入格式
第一行一个正整数 n,表示饮水器的数量。
第二行一个非负整数 k,表示操作次数的上限。
第三行 n 个非负整数,用空格隔开,表示每个饮水器初始的储水量 A[1], A[2], ..., A[n]。
保证 1<=n<=1e6,0<= k <=n-1,0<= A[i]<= 1e3
输出格式
一行,仅一个非负整数,表示居民们最多能喝到的水的单位数。
输入/输出例子1
输入:
10
5
890 965 256 419 296 987 45 676 976 742
输出:
3813
样例解释
无
考场秒想到,不讲了。
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; int n, k; long long a[N], s[N], ans=0; int main() { scanf("%d%d", &n, &k); for (int i=1; i<=n; i++) { scanf("%lld", &a[i]); s[i]=s[i-1]+a[i]; } for (int i=1; i+k<=n; i++) ans=max(ans, s[i+k]-s[i-1]); printf("%lld", ans); return 0; } /* 10 5 890 965 256 419 296 987 45 676 976 742 3813 */