Rolling Variance | ||
Accepted : 68 | Submit : 197 | |
Time Limit : 3000 MS | Memory Limit : 65536 KB Special Judge |
Rolling VarianceBobo learnt that the variance of a sequence a1,a2,…,an is
∑ni=1(ai−a¯)2n−1−−−−−−−−−−−−√
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 ( 1≤i≤n−m+1 ) rolling variance ri is the variance of sequence {ai,ai+1,…,ai+m−1} . InputThe 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 ). OutputFor 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 Input3 2 1 3 2 5 3 1 3 2 4 5 Sample Output1.41421356 0.70710678 1.00000000 1.00000000 1.52752523 |
原题链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1249
题意:如题目名字一样,求滚动方差,运用一般的方法会超时,就算预处理求出前n项和也还是会超时。
原因如下:
∑i=1n(ai−a¯)2=∑i=1na2i−∑i=1n2aia¯+∑i=1na¯2=∑i=1na2i−2∗a¯∗∑i=1nai+n∗a¯2
参考博客:http://blog.youkuaiyun.com/hnust_V/article/details/51763129
AC代码:
/**
* 行有余力,则来刷题!
* 博客链接:http://blog.youkuaiyun.com/hurmishine
*
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int sum[maxn];
int sum2[maxn];
int main()
{
int n,m;
//freopen("data.txt","r",stdin);
while(cin>>n>>m)
{
memset(sum,0,sizeof(sum));
memset(sum2,0,sizeof(sum2));
for(int i=1; i<=n; i++)
{
cin>>a[i];
sum[i]+=sum[i-1]+a[i];
sum2[i]+=sum2[i-1]+a[i]*a[i];
}
/**
两种方法均可
for(int i=m; i<=n; i++)
{
double avg=1.0*(sum[i]-sum[i-m])/m;
double ans=sqrt((sum2[i]-sum2[i-m]-2*avg*(sum[i]-sum[i-m])+m*avg*avg)/(m-1));
printf("%.8f\n",ans);
}
*/
for(int i=0;i<=n-m;i++)
{
double avg=1.0*(sum[i+m]-sum[i])/m;
double ans=sqrt((sum2[i+m]-sum2[i]-2*avg*(sum[i+m]-sum[i])+m*avg*avg)/(m-1));
printf("%.8lf\n",ans);
}
}
return 0;
}
尊重原创,转载请注明出处:http://blog.csdn.net/hurmishine