随机打乱之后每次都进入和最小的那个组,思路应该是没错的。
这个最小用堆维护。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
mt19937 rnd(time(0));
int n, m;
int a[21];
priority_queue<int, vector<int>, greater<int>> pq;
double x[7];
double ans(1e9), pj, res;
signed main(){
cin >> n >> m;
for (int i(1); i<=n; ++i) cin >> a[i];
while (double(clock()) / CLOCKS_PER_SEC < 0.99){
shuffle(a+1, a+n+1, rnd);
for (int i(1); i<=m; ++i) pq.push(0);
for (int i(1); i<=n; ++i){
int tmp(pq.top()+a[i]);
pq.pop();
pq.push(tmp);
}
for (int i(1); i<=m; ++i){
x[i] = pq.top();
pq.pop();
pj += x[i];
}
pj /= m;
for (int i(1); i<=m; ++i) res += pow(pj-x[i], 2);
ans = min(ans, sqrt(res/m));
}
printf("%.2lf", ans);
return 0;
}