XTU 1249 Rolling Variance

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

ni=1(aia¯)2n1
where
a¯=ni=1ain.

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 ( 1inm+1 ) rolling variance ri is the variance of sequence {ai,ai+1,,ai+m1} .

Input

The input contains at most 30 sets. For each set:

The first line contains 2 integers n,m (2mn105) .

The second line contains n integers a1,a2,,an ( |ai|100 ).

Output

For each set, (nm+1) lines with floating numbers r1,r2,,rnm+1 .

Your answer will be considered correct if its absolute or relative error does not exceed 104 .

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¯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值