分析

random_shuffle一下

然后每次贪心的把当前点放进最小的组即可

这样做多次即可

代码

#include<bits/stdc++.h>
using namespace std;
#define lb double
lb ans=10000000000.0,p;
int n,m,a[110],sum[110];
inline lb work(){
    int i,j,k=1;
    lb res=0;
    memset(sum,0,sizeof(sum));
    for(i=1;i<=n;i++){
      for(j=1;j<=m;j++)
       if(sum[j]<sum[k])k=j;
      sum[k]+=a[i];
    }
    for(i=1;i<=m;i++)res+=(sum[i]-p)*(sum[i]-p);
    res/=(double)m;
    return res;
}
int main(){
    int i,j,k,tot=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)scanf("%d",&a[i]),tot+=a[i];
    p=(double)tot/m;
    for(i=1;i<=1000000;i++){
      random_shuffle(a+1,a+n+1);
      ans=min(ans,work());
    }
    printf("%0.2lf\n",sqrt(ans));
    return 0;
}