适用于一些奇怪贪心,同时数据范围不大,单组测试的情况
n个物品放置在m个盒子中求最后的方差最小的情况
1<=m<=n<=15
用随机化的思想直接初始开始的时候m个物品放的东西然后贪心的来到总和最小的接着放剩下的物品
double x[N],s[N];
double aver;
double ans = 2e18;
void get(){
random_shuffle(x+1,x+1+n);
for(int i=1;i<=m;i++) s[i]=x[i];
for(int i=m+1;i<=n;i++){
int p = min_element(s+1,s+1+m)-s;
s[p]+=x[i];
}
double now = 0;
for(int i=1;i<=m;i++) now += (s[i]-aver)*(s[i]-aver);
ans = min(ans,now);
}
void solve(){
srand(time(NULL));
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>x[i],aver+=x[i];
aver/=m;
while((double)clock()/CLOCKS_PER_SEC < 1.9) get();
//(1.9这个时间依照题变化)
cout << LF(10) << (ans/m) << endl;
return ;
}