为什么这个退火只拿了12分?
查看原帖
为什么这个退火只拿了12分?
448887
cancan123456楼主2021/12/12 18:24
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
int n;
ll a[10005], b[10005];
ll variance() {
	ll ans = 0;
	for (int i = 1; i <= n; i++) {
		ans += n * a[i] * a[i];
	}
	ll s = 0;
	for (int i = 1; i <= n; i++) {
		s += a[i]; 
	}
	ans -= s * s;
	return ans;
}
double rand_double() {
	return 2.0 * rand() - RAND_MAX;
}
ll tuihuo(unsigned int x) {
	for (int i = 1; i <= n; i++) {
		a[i] = b[i];
	}
	ll answer = 0x7fffffffffffffffLL;
	srand(x);
	double T = 3000;
	while (T >= 1e-15) {
		int i = rand() % (n - 2) + 2;
		a[i] = a[i - 1] + a[i + 1] - a[i];
		ll DeltaAnswer = variance() - answer;
		if (DeltaAnswer >= 0) {
			answer += DeltaAnswer;
		} else if (exp(- DeltaAnswer / T) * RAND_MAX > rand()) {
			answer += DeltaAnswer;
		} else {
			a[i] = a[i - 1] + a[i + 1] - a[i];
		}
		T *= 0.9997;
	}
	return answer;
}
ll min(ll a, ll b) {
	return a < b ? a : b;
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", b + i);
	}
	ll FinallyAnswer = 0x7fffffffffffffffLL;
	FinallyAnswer = min(FinallyAnswer, tuihuo(114514));
	FinallyAnswer = min(FinallyAnswer, tuihuo(1919810));
	FinallyAnswer = min(FinallyAnswer, tuihuo(19260817));
	FinallyAnswer = min(FinallyAnswer, tuihuo(998244353));
	FinallyAnswer = min(FinallyAnswer, tuihuo(1000000007));
	printf("%lld\n", FinallyAnswer);
	return 0;
}
2021/12/12 18:24
加载中...