CF808B Average Sleep Time 题解

Content

给定 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),求所有长度为 \(k\) 的连续区间 \([a_1,a_k],[a_2,a_{k+1}],...[a_{n-k+1},a_n]\) 的和的平均值。

数据范围:\(1\leqslant n,k\leqslant 2\times 10^5,1\leqslant a_i\leqslant 10^5\)

Solution

首先,我们可以发现,直接暴力枚举的 \(\mathcal{O}(nk)\) 的复杂度是不可能通过这道题目的。那么怎么办?

答案是:前缀和。前缀和是指从 \(1\) 开始到每个位置的和,也就是从 \(1\)\(2,3,4,...,n\) 的前缀和,一般用 \(s_i\) 来表示 \([1,i]\) 的和,下面的 \(s_i\) 意义与此相同。

那么这道题目就有办法了:先预处理出所有 \(s_i\),然后答案就是 \(\dfrac{\sum\limits_{i=1}^{n-k+1}s_{i+k-1}-s_{i-1}}{n-k+1}\)

Code

ll n, k, a[200007], s[200007], sum;

int main() {
	getll(n), getll(k);
	for(ll i = 1; i <= n; ++i) {
		getll(a[i]);
		s[i] = s[i - 1] + a[i];
	}
	for(ll i = 1; i <= n - k + 1; ++i)
		sum += s[i + k - 1] - s[i - 1];
	printf("%.9lf", (sum * 1.0 / (n - k + 1)));
	return 0;
}
posted @ 2021-12-21 20:03  Eason_AC  阅读(42)  评论(0)    收藏  举报