[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);
posted @ 2020-04-19 22:52  Jayun  阅读(111)  评论(0编辑  收藏  举报