湘潭oj_Rolling Variance1249(直接求)

来源:互联网 发布:刘德华救歌迷知乎 编辑:程序博客网 时间:2024/09/21 06:18
#include<stdio.h> #include<string.h> #include<math.h> int a[100001],c[201];    //c数组统计每个数出现的次数 double aver[100001],sum1[100001]; int main(){     int n,m;     while(~scanf("%d%d",&n,&m)){         memset(a,0,sizeof(a));         memset(c,0,sizeof(c));         memset(aver,0.0,sizeof(aver));         memset(sum1,0.0,sizeof(sum1));         int i,j;         for(i=1;i<=n;i++)          {              scanf("%d",&a[i]);            sum1[i]=sum1[i-1]+a[i];                 }     for(i=m;i<=n;i++) aver[i]=(sum1[i]-sum1[i-m])/m;       for(i=1;i<=m;i++)       {            if(a[i]>=0) c[a[i]]++;            else c[-a[i]+100]++; //-100至-1的数取绝对值+100存储(-20按120存储)       }           for(i=m;i<=n;i++)           {               double sum=0;                   if(i!=m) {                  //动态变化维护,长度为m的数列中每个数出现的次数。(数据中每个数的值都在-100-100之间)                  if(a[i]>=0) c[a[i]]++;                   else c[-a[i]+100]++;                  if(a[i-m]>=0) c[a[i-m]]--;                  else c[-a[i-m]+100]--;               }               for(j=0;j<=100;j++)                 sum+=c[j]*(j-aver[i])*(j-aver[i]);               for(j=101;j<=200;j++)                 sum+=c[j]*(100-j-aver[i])*(100-j-aver[i]);               printf("%0.8lf\n",sqrt(sum/(m-1)));           }     } return 0; } 

1 0
原创粉丝点击