2019多校国庆集训派对day6G题

题目链接: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值