0
点赞
收藏
分享

微信扫一扫

Comet OJ C1412 [HAOI2006]均分数据


题目链接:​​传送门​​

随机贪心,random_shuffle一个序列
开一个数组表示分的
每次找一个最小的加上当前的
意思就是让数组尽可能平均,最后的均方差也就会小
由于比较小,做上几十万次很ok

#include <bits/stdc++.h>

using namespace std;
int n, m; double a[31], f[7], sum, ans = INT_MAX;

int main(int argc, char const *argv[]) {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i], sum += a[i];
double ave = sum / m;
for (int i = 1; i <= 200000; i++) {
random_shuffle(a + 1, a + n + 1);
for (int j = 1; j <= 6; j++) f[j] = 0;
for (int j = 1; j <= n; j++) {
int pos = 1;
for (int k = 1; k <= m; k++)
if (f[k] < f[pos]) pos = k;
f[pos] += a[j];
}
double th = 0;
for (int j = 1; j <= m; j++) th += (f[j] - ave) * (f[j] - ave);
ans = min(ans, th / m);
}
cout << fixed << setprecision(2) << sqrt(ans) << endl;
}


举报

相关推荐

0 条评论