里面写到了方差的展开,把O(n*m)优化到了O(n)
前缀和!!!!!
注意要把INF写的大一点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
long long a[10001],sum1[10001]={0},sum2[10001]={0};
for(int i=1;i<=n;i++){
scanf("%lld",a+i);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
sum1[i]=sum1[i-1]+a[i];
sum2[i]=sum2[i-1]+a[i]*a[i];
}
double INF=1e15+10;
for(int i=m;i<=n;i++){
double fz=(sum2[i]-sum2[i-m])-1.0*(sum1[i]-sum1[i-m])*(sum1[i]-sum1[i-m])/m;
if(fz<INF) INF=fz;
}
cout<<(long long)INF<<endl;
return 0;
}