救救吧真的调不出来,悬1关
#include <bits/stdc++.h>
using namespace std;
namespace lgh {
#define int long long
#define db double
const int N = 25;
const int M = 10;
const db initem = 9000, rate = 0.999, eps = 1e-6;
int n, m;
int a[N], bel[N]; // bel[i]表示第i个数所属的集合
int sum[M]; // sum[i]表示第i个集合的元素之和
db avg, ans, an = 1e18;
db calc(int *sum) {
#define sqr(x) ((x) * (x))
db res = 0;
for(int i = 1; i <= m; ++i)
res += sqr(avg - sum[i]);
return res;
}
int nsum[M], nbel[N];
int tsum[M], tbel[N];
void sa() {
memcpy(nsum, sum, sizeof sum);
memcpy(nbel, bel, sizeof bel);
db tem = initem;
while(tem >= eps) {
memcpy(tsum, nsum, sizeof nsum);
memcpy(tbel, nbel, sizeof nbel);
int elem = 1 + rand() % n; // elem表示要切换分组的元素
int tar = 1 + rand() % m; // tar表示目标集合
tsum[bel[elem]] -= a[elem];
tsum[tar] += a[elem];
tbel[elem] = tar;
db cur = calc(tsum);
db delta = cur - ans;
if(delta < 0) {
memcpy(sum, tsum, sizeof tsum);
memcpy(bel, tbel, sizeof tbel);
memcpy(nsum, tsum, sizeof tsum);
memcpy(nbel, tbel, sizeof tbel);
ans = cur;
} else if(exp(-delta / tem) * RAND_MAX < rand()) {
memcpy(nsum, tsum, sizeof tsum);
memcpy(nbel, tbel, sizeof tbel);
}
tem *= rate;
}
an = min(an, ans);
}
signed main() {
scanf(" %lld %lld", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf(" %lld", &a[i]);
avg += a[i];
bel[i] = 1 + rand() % m;
sum[bel[i]] += a[i];
}
avg /= m;
ans = calc(sum);
while(1.0 * clock() / CLOCKS_PER_SEC <= 0.95) sa();
for(int i = 1; i <= 1e6; ++i) {
memcpy(tsum, sum, sizeof sum);
memcpy(tbel, bel, sizeof bel);
int elem = 1 + rand() % n; // elem表示要切换分组的元素
int tar = 1 + rand() % m; // tar表示目标集合
tsum[bel[elem]] -= a[elem];
tsum[tar] += a[elem];
tbel[elem] = tar;
db cur = calc(tsum);
db delta = cur - ans;
if(delta < 0) {
memcpy(sum, tsum, sizeof tsum);
memcpy(bel, tbel, sizeof tbel);
ans = cur;
}
}
an = min(an, ans);
printf("%.02lf", sqrt(an / m));
return 0;
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("4.in", "r", stdin);
freopen("4.out", "w", stdout);
#endif
return lgh::main();
}