模拟退火55pts,求Hack
查看原帖
模拟退火55pts,求Hack
1042152
Resss楼主2024/8/24 09:06

求Hack!!!

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
int n;
int p[N+5][N+5],q[N+5][N+5];
int a[N+5],ans;
int get(){
	int s=0;
	for(int i=1;i<=n;i++){
		s+=p[i][a[i]]*q[a[i]][i];
	}
	return s;
}
void sa(){
	double t0=100000,tk=0.98857;
	while(t0>0.0000000001){
		int x=rand()%n+1,y=rand()%n+1;
		swap(a[x],a[y]);
		int num=get();
		int de=num-ans;
		if(num>ans) ans=num;
		else if(exp(-de/t0)*RAND_MAX>=rand()) swap(a[x],a[y]);
		t0*=tk;
	}
	return;
}
signed main(){
	srand(time(NULL));
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) a[i]=i;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lld",&p[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lld",&q[i][j]);
		}
	}
	ans=get();
	for(int i=1;i<=100;i++) sa();
	printf("%lld",ans);
	return 0;
}
2024/8/24 09:06
加载中...