题目链接:https://ac.nowcoder.com/acm/contest/1111/G
题意理解:
给你一个含有n个数的数组,求数组中连续m个数的r值,ri = sqrt( ∑(ai-a)^2 / (m-1)),a = ∑ai / m。
题解:
需要理解前缀和的思想。
维护两个前缀和数组,sum1[i]表示1到i的数之和,sum2[i]表示1到i的数的平方和。
公式可以拆成 ri = sqrt( ( ∑ai^2 - 2*∑ai*a + (m-1)*a^2) / (m-1) ) ,a=∑ai / m;
sum1相当于求的是∑ai,以及平均值a,sum2相当于求的是∑ai^2。
很好理解的!!!!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1e5+5;
int sum2[maxn],a[maxn];
int sum1[maxn];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
sum1[0]=sum2[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum1[i]=sum1[i-1]+a[i];
sum2[i]=sum2[i-1]+a[i]*a[i];
}
for(int i=1;i<=n-m+1;i++){
double s1=sum1[i+m-1]-sum1[i-1];
double average=(sum1[i+m-1]-sum1[i-1])*1.0/m;
double s2=sum2[i+m-1]-sum2[i-1];
// printf("%lf %lf %lf",s1,average,s2);
double res=sqrt((s2-2*s1*average+m*average*average)/(m-1));
printf("%lf\n",res);
}
}
return 0;
}