排序之后,扫一遍即可,排序后,在这段序列中连续的一段序列的方差肯定比不连续的序列的方差小,因为连续的序列相对于平均值来说,波动的范围比较小。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 10010;
LL num[MAXN];
LL prefixSum[MAXN];
int M,N;
int main()
{
ios::sync_with_stdio(false);
cin >> M >> N;
for(int i = 1; i <= M; ++i)
cin >> num[i];
sort(num+1,num+1+M);
for(int i = 1; i <= M; ++i)
prefixSum[i] = prefixSum[i-1]+num[i];
double res = 1LL<<60;
for(int i = 1; i <= M-N+1; ++i)
{
double sum = prefixSum[i+N-1]-prefixSum[i-1];
double k = sum/N;
double tr = 0;
for(int j = i; j < i+N; ++j)
tr = tr + (num[j]-k)*(num[j]-k);
if(tr < res)
res = tr;
}
cout << (LL)res << endl;
return 0;
}