退火90pts WA on #10 求调悬关!!
查看原帖
退火90pts WA on #10 求调悬关!!
544520
liugh_楼主2023/11/15 08:05

救救吧真的调不出来,悬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();
}
2023/11/15 08:05
加载中...