51Nod 1098 最小方差 排序

来源:互联网 发布:开农村淘宝靠什么赚钱 编辑:程序博客网 时间:2024/05/14 19:54



题解传送门

里面写到了方差的展开,把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;}


原创粉丝点击