求助,玄关
  • 板块学术版
  • 楼主Sgt_
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/18 22:09
  • 上次更新2024/8/19 10:27:12
查看原帖
求助,玄关
1223722
Sgt_楼主2024/8/18 22:09

题目链接

已AC,但是有一个地方不清楚

#include<bits/stdc++.h>
#define maxn 50010
#define ll long long
using namespace std;
#define int long long
int A,suml,sumr,n,a[maxn],ans;
const double begt=11437.7870,//初温
			 endt=1e-18,//结束温度
			 ct=0.99;//温度变化系数
double T;
void SA(){
	T=begt;
	while(T>endt){
		int x=0,y=0;
		int m=n/2;
		if(m==0)m++;
		
		x=rand()%m+1;//x为[1,2/n]
		
		y=rand()%((n+1)/2)+(n/2)+1;//y为[(n+1)/2,n]
		suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];
		swap(a[x],a[y]);
		int now=abs(suml-sumr);
		if(now<=ans)ans=now;
		else if(exp((ans-now)/T)<(double)rand()/RAND_MAX){suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];swap(a[x],a[y]);}
		T*=ct;
	}
}
signed main(){
	srand(time(0));
	cin>>A;
	while(A--){
		suml=0;sumr=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(i<=n/2)suml+=a[i];
			else sumr+=a[i];
		}
		ans=abs(suml-sumr);
		for(int i=1;i<=50;i++)SA();
		cout<<ans;puts("");
	}
	return 0;
}

其中,这个地方不太清楚为什么

	if(now<=ans)ans=now;
		else if(exp((ans-now)/T)<(double)rand()/RAND_MAX){suml-=a[x];suml+=a[y];sumr-=a[y];sumr+=a[x];swap(a[x],a[y]);}

玄关

2024/8/18 22:09
加载中...