求助:退火90分WA了第二个点
查看原帖
求助:退火90分WA了第二个点
545681
wzlpl楼主2021/10/5 18:36
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],q[110],p[110];
int ans;
int flag;
int n,m,k,c;
int check() {
	int sum=0;
	for(int i=1; i<=k; i++) {
		sum+=a[q[i]]*a[p[i]];
	}
	return sum;
}
void sa() {
	double t=10000,down=0.999;
	while(t>1e-11) {
		int x=rand()%m+1,y=rand()%m+1;
		swap(q[x],q[y]);
		swap(p[x],p[y]);
		int sumx=0;
		for(int i=1; i<=k; i++) {
			if(sumx<c) {
				sumx+=b[q[i]]+b[p[i]];
			} else break;
		}
		if(sumx<c) {
			t*=down;
			continue;
		}
		int k1=check();
		if(k1>ans) {
			ans=k1;
		} else if(exp((ans-k1)/t)<double(rand())/RAND_MAX);
		else {
			swap(q[x],q[y]);
			swap(p[x],p[y]);
		}
		t*=down;
	}
}
void solve() {
	for(int i=1; i<=20; i++)
		sa();
}
int main() {
	scanf("%d%d%d%d",&n,&m,&k,&c);
	for(int i=1; i<=n; i++)
		scanf("%d",&a[i]);
	for(int i=1; i<=n; i++)
		scanf("%d",&b[i]);
	for(int i=1; i<=m; i++)
		scanf("%d%d",&p[i],&q[i]);
	solve();
	if(ans!=0)
		printf("%d",ans);
	else printf("-1");
}
2021/10/5 18:36
加载中...