[NOI Online #3 提高组]水壶
题目大意:
在一个长度为 \(n\) 的序列中求出长度为 \((k+1)\) 的最大子段。
正文:
本题唯一的需要注意的一点是当 \(k=n\) 时要输出所有数的和,像我的考场代码:
scanf("%d%d", &n, &k);
k++;
if(k > n) k = n;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= k; i++)
op += a[i];
for (int i = k + 1; i <= n; i++)
{
if(ans < op) ans = op;
op += a[i] - a[i - k];
}
printf("%lld", ans);
要是 \(n\leq k\) 就锅了。
正确代码:
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= k + 1; i++)
op += a[i];
for (int i = min(k + 1, n); i <= n; i++)
{
if(ans < op) ans = op;
op += a[i + 1] - a[i - k];
}
printf("%lld", ans);