若x1,x2,x3......xn的平均数为k。
则方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+.......+(xn-k)^2] 。
方差即偏离平方的均值,称为标准差或均方差,方差描述波动程度。
Input
第1行:2个数M,N,(M > N, M <= 10000) 第2 - M + 1行:M个数的具体值(0 <= Xi <= 10000)
Output
输出最小方差 * N的整数部分。
Input示例
5 3 1 2 3 4 5
Output示例
2
将s^2 = 1/n * [(x1-k)^2+(x2-k)^2+.......+(xn-k)^2] 化成一般项然后直接找。。。。
化为 x1^2+x2^2+·····+xn^2+n*k-2*k*(x1+x2+x3+·····+xn) 然后就好解决了。。ok的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10000+10;
typedef long long ll;
ll a[maxn],pre[maxn],sum[maxn];
long double aver[maxn];
int main()
{
ios::sync_with_stdio(false);
int n,m,i,j;
long double ans,t;
cin>>m>>n;
for(i=1;i<=m;i++) cin>>a[i];
sort(a+1,a+m+1);
for(i=1;i<=m;i++) {
sum[i]=sum[i-1]+a[i];
pre[i]=pre[i-1]+a[i]*a[i];
}
int ss=0;
for(i=1;i<=n;i++) ss+=a[i];
aver[i-1]=(double) ss/n;
for(i=n+1;i<=m;i++) {
ss=ss-a[i-n]+a[i];
aver[i]=(double) ss/n;
}
ans=(double) pre[n]+n*aver[n]*aver[n]-2*aver[n]*sum[n];
for(i=n+1;i<=m;i++) {
t=pre[i]-pre[i-n]+n*aver[i]*aver[i]-2*aver[i]*(sum[i]-sum[i-n]);
ans=min(ans,t);
}
ans=floor(ans);
cout<<(long long)ans<<endl;
return 0;
}