Rolling Variance
Accepted : 77 | Submit : 212 | |
Time Limit : 3000 MS | Memory Limit : 65536 KB Special Judge |
Rolling Variance
Bobo learnt that the variance of a sequence a1,a2,…,an is
Bobo has a sequence a1,a2,…,an ,and he would like to find the variance of each consecutive subsequences of length m .Formally, the i -th ( 1≤i≤n−m+1 ) rolling variance ri is the variance of sequence {ai,ai+1,…,ai+m−1} .
Input
The input contains at most 30 sets. For each set:
The first line contains 2 integers n,m (2≤m≤n≤105) .
The second line contains n integers a1,a2,…,an ( |ai|≤100 ).
Output
For each set, (n−m+1) lines with floating numbers r1,r2,…,rn−m+1 .
Your answer will be considered correct if its absolute or relative error does not exceed 10−4 .
Sample Input
3 2 1 3 2 5 3 1 3 2 4 5
Sample Output
1.41421356 0.70710678 1.00000000 1.00000000 1.52752523
解题思路:先求出m个连续的数的平均值a,然后求(ai-a)^2
求和:(a0+a)^2+(a1+a)^2+(a2+a)^2+(a3+a)^2+···
=a0^2+2*a*a0+a^2+a1^2+2*a*a1+a^2+a2^2+2*a*a2+a^2+·····
=(a0^2+a1^2+····)+a2^2+2*a*(a0+a1+a2+····)+(a^2+a^2+a^2+·····)
代码如下:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxn 100001
int a[maxn],b[maxn];
int main()
{
int n,m,c;
while(scanf("%d %d",&n,&m)!=EOF)
{
int i;
for(i=1; i<=n; i++)
{
scanf("%d",&c);
a[i]=a[i-1]+c;///前i个数的和
b[i]=b[i-1]+c*c;///前i个数的平方和
}
for(i=m; i<=n;i++)
{
double s=0;
s=1.0*(a[i]-a[i-m])/(1.0*m);///求出平均数
s=b[i]-b[i-m]+s*s*m-2.0*s*(a[i]-a[i-m]);
printf("%0.8lf\n",(double)sqrt(s/(m-1)));
}
}
return 0;
}
aa¯